2012-09-28 48 views
0

誰能告訴我,爲什麼下面的失敗:Python「if」是否評估「and」的雙方?

teststr = "foo" 
if not teststr.isdigit() and int(teststr) != 1: 
    pass 

有:

ValueError: invalid literal for int() with base 10: 'foo' 

在C如果在&&測試第一部分失敗右手邊不再被評估。這在Python中有什麼不同?

編輯:我很愚蠢。 and當然應該是or .....

+3

也許'不是'導致第一部分評估爲真? –

+0

'如果不是teststr.isdigit()'? –

+0

@JohnBoker如果我括號,它仍然失敗:'if(not teststr.isdigit())and(int(teststr)!= 1):' – RickyA

回答

8

not teststr.isdigit()是真的,所以第一次測試不會失敗。

+0

是的,那正是我的大腦停止工作的地方... – RickyA

0

if not teststr.isdigit()爲真,那麼它需要評估int(teststr)以完成and的要求 - 因此是例外。

,而不檢查前的數據,利用EAFP - 並使用類似下面的...

try: 
    val = int(teststr) 
    if val != 1: 
     raise ValueError("wasn't equal to 1") 
except (ValueError, TypeError) as e: 
    pass # wasn't the right format, or not equal to one - so handle 
# carry on here... 
2
if not teststr.isdigit() and int(teststr) != 1: 

if ((not teststr.isdigit()) and (int(teststr) != 1)): 

好評價,但teststr不是數字,所以isdigit()是錯誤的,所以(not isdigit())爲真。並且對於True and B,您必須評估B.這就是爲什麼它將轉換爲int的原因。

+0

是的,這就是我想要的 – RickyA

+3

我可以向你保證這不是你想要的,因爲如果'not teststr.isdigit()'爲true,那麼int )'每次都會引發異常。也許你的意思是'或'? – geoffspear

+0

不錯,但teststr不是一個數字,所以isdigit()是false,所以(不是isdigit())是真的。對於True和B,您必須評估B. – ch3ka

0

你可能想使用很可能是

try: 
    int(teststr) 
except ValueError: 
    print "Not numeric!" 

這是通常更Python嘗試一些和捕獲異常,而不是使用類型檢查方法,像你這樣的代碼。