2017-09-15 78 views
3

它是否會阻止問題在重新定義條件的所有可能分支之前定義變量?在條件中聲明變量是否存在問題?

例如應此代碼:

# Condition could fail 
    try: 
     textureIndices = someExpression() 

    # textureIndices is defined here if it does 
    except: 
     textureIndices = [] 

    return textureIndices 

重新寫成這樣:

# textureIndices is defined early and then re-defined in the conditional 
    textureIndices = None 

    try: 
     textureIndices = someExpression() 


    except: 
     textureIndices = 66 

    return textureIndices 

,或者因except打開等問題,是否存在與textureIndices這裏定義一個問題:

if condition: 
    textureIndices = someExpression() 

else: 
    textureIndices = 66 

return textureIndices 

減少問題?

唯一的區別是在第二個版本textureIndices是在條件之外定義的。

我不明白爲什麼它很重要,因爲textureIndices不可能在條件中被賦予一個值,但我可以看到爲什麼從管家的角度來看,很高興知道該變量被分配給某些東西。

例如如果有第一個例子沒有except語句,那麼textureIndices並不總是被定義和return會導致錯誤。

但是,如果不轉發在兩個條件的原因中定義的定義變量,是否存在問題?

+1

在你的第一個案例中,除了SomeError外,你使用'except'而不是''。既然你不應該把所有的錯誤都包括在內,那麼在你的實踐中,你的變量是不可能存在的,除非你先前定義了它。 – roganjosh

+0

「應重寫」的來源是什麼?編譯器和運行時系統很好。 – Prune

回答

4

其中一個原因是它會創建冗餘代碼。在這種情況下,它看起來不是很明顯,但舉一個例子,您有多個唯一的除外語句捕捉代碼中的多個異常。想象一下,如果有人想重構你的代碼或添加額外的除外聲明。

textureIndices = None 

try : 
    textureIndices = [thing for thing in func()]fail 

except InvalidTextException: 
    textureIndices = [] 
    #lines to handle specific exception 
except ValueError: 
    textureIndices = [] 
    #lines to handle specific exception 
except OSError: 
    textureIndices = [] 
    #lines to handle specific exception 

return textureIndices 

如果你有多個這樣表現的變量,你可以看到它如何快速升級。通過首先聲明基本案例,可以減少冗餘。

textureIndices = [] 

try : 
    textureIndices = [thing for thing in func()]fail 

except InvalidTextException: 
    #lines to handle specific exception 
except ValueError: 
    #lines to handle specific exception 
except OSError: 
    #lines to handle specific exception 

return textureIndices 
3

可變字典(取決於範圍localsglobals),當創建一個變量被修改。

在一種情況下,您正在創建變量,然後修改它的任何分支:1創建+賦值,1賦值(完全覆蓋舊值)。

在你忽略了事先建立的情況下,你只有1個創建+分配,所以在技術上它的速度更快事先聲明其分支(少了一個字典查找,少了一個無用的分配)

除了幫助Python IDE完成分支中的變量名之外,我會說事先聲明在這種情況下是無用的,甚至很麻煩,因爲兩個分支都被覆蓋了(可能是一種舊的編譯語言編程反射)。唯一可能有興趣的情況是一組複雜的分支,您只需在幾個分支中設置變量。這裏不是這種情況。

+0

這裏不是這種情況,但通常不應該在您遇到的錯誤中具體說明嗎?即使你只捕獲了2個特定的錯誤,其餘的都會崩潰你的腳本,你必須定義默認值兩次,並不會打敗DRY(以非常小的方式)? – roganjosh

+1

不確定你在說什麼。當然,嘗試/除非沒有異常類型(甚至是'Exception')是不好的做法。它甚至可以捕捉到CTRL + C。但是這似乎與這個問題無關。 –

+0

剛剛發佈的答案說明了我的觀點。我建議評論OP是基於這個問題關閉不適用於一個毯子'除' – roganjosh