2013-12-20 2 views
1

У меня есть вопрос о python.Python: проверка типа переменных

У меня есть переменные a, b, c и d.

И у меня есть следующие строки:

if not isinstance(a, int) or not isinstance(b, int) \ 
    or not isinstance(c, int) or not isinstance(d, int) \ 
    or not isinstance(a, float) or not isinstance(b, float)\ 
    or not isinstance(c, float) or not isinstance(d, float): 
    do something 

Можно ли сделать этот код короче?

Спасибо!

+5

Поскольку либо 'isinstance (а, Int)' или 'isinstance (a, float)' будет False, ответ smartass заключается в том, что if всегда истинно и может быть полностью опущен ... – RemcoGerlich

+0

Я бы просто опустил проверку и поймал любые возникающие ошибки в следующем коде. – Matthias

+0

Взгляните на мой ответ, пожалуйста, чтобы увидеть проблему .... – eyquem

ответ

5

U следует использовать all:

if not all(isinstance(var, (int, float)) for var in [a, b, c, d]): 
    # do stuff 

Обратите внимание, что вы можете поставить как int и 'поплавок' на isinstance вызова.

+1

Используйте выражение генератора. В противном случае проверяется весь элемент. – falsetru

+1

Это должно быть 'не все (...)' или 'any (not ...)'. Не так ли? – falsetru

+0

Спасибо за оба комментария, я действительно немного испортил код. –

1
>>> a = b = c = d = [] 
>>> any(not isinstance(x, (int, float)) for x in [a,b,c,d]) 
True 
>>> d = 0 
>>> any(not isinstance(x, (int, float)) for x in [a,b,c,d]) 
False 
+0

Большое спасибо! – SomeOne

2

Попробуйте следующее:

>>> a = 1 
>>> b = 1.0 
>>> c = 123 
>>> d = 233 
>>> any((type(var) in (int, float) for var in [a,b,c,d])) 
True 
>>> c = 'hello' 
>>> any((type(var) in (int, float) for var in [a,b,c,d])) 
True 
>>> 
+0

Большое спасибо! – SomeOne

0

На самом деле, то, что вы пишите равно

if True: 
    do_somthing 
    pass 
+0

Вы должны были разработать свой ответ – eyquem

-3

Ясно, что вы не приняли достаточно внимания на замечания RemcoGerlich, так как вы upvoted и принял бессмысленный ответ.
В то время я пишу это, еще 4 человека поддержали тот же бессмысленный ответ.
Это невероятно.
Вы увидите лучше с этим? :

def OP(a,b,c): 
    return not isinstance(a, int)\ 
      or not isinstance(b, int)\ 
      or not isinstance(c, int)\ 
      or not isinstance(a, float)\ 
      or not isinstance(b, float)\ 
      or not isinstance(c, float) 

def AZ(a,b,c): 
    return all(isinstance(var, (int, float)) 
       for var in [a, b, c]) 

gen = ((a,b,c) for a in (1, 1.1 ,'a') 
     for b in (2, 2.2, 'b') for c in (3, 3.3, 'c')) 

print '     OPv | AZv  OPv is AZv\n'\ 
     '     -----|----- -----------' 
OPV_list = [] 
for a,b,c in gen: 
    OPv = OP(a,b,c) 
    OPV_list.append(OPv) 
    AZv = AZ(a,b,c) 
    print '%3r %3r %3r %s | %s  %s'\ 
      % (a,b,c,OPv,AZv,OPv is AZv if OPv is not AZv else '') 

print '------------- ----' 
print 'all(OPV_list) : ',all(OPV_list) 

результат
ОПВ = ваш
AZV = бессмысленны ответ
я ограничен, б, в, чтобы сделать его коротким

    OPv | AZv  OPv is AZv 
       -----|----- ----------- 
    1 2 3 True | True  
    1 2 3.3 True | True  
    1 2 'c' True | False  False 
    1 2.2 3 True | True  
    1 2.2 3.3 True | True  
    1 2.2 'c' True | False  False 
    1 'b' 3 True | False  False 
    1 'b' 3.3 True | False  False 
    1 'b' 'c' True | False  False 
1.1 2 3 True | True  
1.1 2 3.3 True | True  
1.1 2 'c' True | False  False 
1.1 2.2 3 True | True  
1.1 2.2 3.3 True | True  
1.1 2.2 'c' True | False  False 
1.1 'b' 3 True | False  False 
1.1 'b' 3.3 True | False  False 
1.1 'b' 'c' True | False  False 
'a' 2 3 True | False  False 
'a' 2 3.3 True | False  False 
'a' 2 'c' True | False  False 
'a' 2.2 3 True | False  False 
'a' 2.2 3.3 True | False  False 
'a' 2.2 'c' True | False  False 
'a' 'b' 3 True | False  False 
'a' 'b' 3.3 True | False  False 
'a' 'b' 'c' True | False  False 
------------- ---- 
all(OPV_list) : True 
Смежные вопросы