2017-06-26 41 views
3

我有一些Python代碼是這樣的:Python名稱未定義,但確實評估爲true。怎麼樣?

try: 
    bob = bob_module.Bob('alpha') 
except Exception as e: 
    print 'Alpha mode failed for bob: ' + str(e) + ').' 

try: 
    if bob: 
     bob.add('Beta') 
    else: 
     bob = bob_module.Bob('Beta') 
except Exception as e: 
    print 'Beta mode failed for bob: ' + str(e) + ').' 

此代碼時跑阿爾法模式失敗,一個可以理解的原因(與阿爾法服務器交互失敗)。但是,由於「名稱」bob「未定義」的原因,beta模式失敗。

當然,如果名稱bob沒有定義,那麼if bob等於假,我們拖放到else條款並運行Bob構造結果賦給變量bob

我現在不能調試這個,因爲導致Alpha模式失敗的錯誤是暫時的,現在已經消失了,但我想理解這一點有兩個原因:智力好奇心,並使我的代碼在alpha模式下健壯開始再次失敗。

+4

_「當然,如果名字bob沒有定義,那麼如果bob等於false_」嗯,沒有。這就像說:「如果外國人不存在,他們肯定是綠色的」。這沒有任何意義。如果它不存在,它應該如何評估任何事情? –

+1

'name bob is not defined'意思是'如果bob'失敗,不是'else'執行。沒有被定義與「無」或「假」不一樣 –

+1

由於'bob = bob'引發了異常bob沒有被設置。見[這個答案](https://stackoverflow.com/a/25666911/4725649) – EndermanAPM

回答

2

當你這樣做:

bob = bob_module.Bob('alpha') 

Python將不會達到分配階段(從函數調用失敗分配返回) - 它會直接跳到異常捕獲階段。

自從鮑勃仍然是不確定的,當您嘗試在聲明以後使用它:

if bob: 

Python不知道什麼bob是,更不用說如果將評估爲TrueFalse所以它會彈出另一個錯誤。

如果你想擁有bob預先定義的,無論第一個函數的執行結果,只是分配None給它的函數調用之前,這樣Python知道bobNone,因此可以適當的if語句評價它,不管之前發生的事情。

UPDATE - 如果你真的不想要定義bob事先,你仍然可以檢查其存在的東西,如:

if "bob" in globals(): # replace globals() with locals() for the current scope 

或檢查是否存在,並評估了這兩個True

if globals().get("bob", None): # replace globals() with locals() for the current scope 
6

Surely if name bob is not defined then if bob equates to false

如果沒有定義bob,則嘗試使用它是錯誤的。

bob = None放在文件的頂部,以確保它在所有代碼路徑中定義。

+0

謝謝,Smarx。我把滴答聲給了一個更全面的答案,但是無論如何都提高了你的答案。 – AlastairG

相關問題