2016-09-17 68 views
0

我正在開發這個Python項目,我多次遇到這種情況,我想知道是否有更好的方法。避免額外的線路進行屬性檢查?

有一個類實例的列表。列表的一部分是空的(填寫None)。 以下是一個示例列表。

ins_list = [ins_1, ins_2, None, ins_3, None] 

我必須在整個程序流程中做一些確認。有些地方需要控制這些實例的屬性。但是從列表中選擇一個實例只有索引,它可能是空的元素之一。當調用屬性時會出現錯誤。這是一個示例程序流程。

ind = 2 

if ins_list[ind].some_attribute == "thing": 
    # This would give error when empty element is selected. 

我通過解決這個問題,

if ins_list[ind]: 
    if ins_list[ind].some_attribute == "thing": 
     # This works 

我沒關係使用此。然而,該計劃是一個長期的計劃,我應用了數百次。有沒有更容易,更好的方式做到這一點,這意味着我正在生成縮進代碼並無故增加縮進級別。我想知道是否有這樣的解決方案。

回答

0

有兩個選項:

使用詞典:

另一種方法是使用dictionary代替。所以你可以創建你的字典,一旦列表中充滿了元素。字典的鍵將是您列表的值,作爲值,您可以使用非「None」和「No_attr」的元素的屬性作爲None的元素。 (注:有記住,Python字典不支持重複鍵,這就是爲什麼我提出以下存儲作爲密鑰列表索引否則你必須找到一種方法,使鍵有所不同)

例如像列表:

l = [item1,item2,None,item4] 

您可以創建一個字典:

d = {item1:"thing1", item2:"thing2", None:"No_attr", item3:"thing3"} 

所以這樣你每次都需要做檢查的時候,你就不必檢查兩個條件,但你只能檢查值,如:

if d.values()[your_index]=="thing": 

唯一缺點這種方法的是標準Python字典是固有無序,這使得由索引訪問字典值有點危險有時 - 你必須要小心,不要改變字典的形式安排。現在

,如果你想確保指數保持穩定,那麼你就必須存儲它的一些方式,例如選擇爲鍵你的字典的的指標,因爲你將已經存儲項目的屬性 - 但是這是你必須決定的東西,並且強烈依賴於你的項目的架構。

使用列表:

在使用list小號的方式,我不認爲有一種方法來避免你的if語句 - 而不是壞的實際。也許使用and運算符,因爲它在另一個答案中已經提到過,但我認爲這沒有任何區別。

此外,如果你想使用第一種方法: if ins_list[ind].some_attribute == "thing":

你可以嘗試使用和異常捕手這樣的:

try: 
    if ins_list[ind].some_attribute == "thing": 
     #do something 
except: 
    #an error occured 
    pass 
+0

'None'必須存在於我的程序列表中。該列表是一個預先確定的數據持有者,其元素被填滿並清空。 –

0

使用布爾運算符and

if ins_list[ind] and ins_list[ind].some_attribute == "thing": 
    # Code 
0

提議編碼器,你可以從你的列表中刪除無,或用字典來代替,以避免必須爲每個索引的條目。

我想提出另一種方法:您可以創建一個dummyclass並將其替換爲None。這樣就沒有錯誤,如果你設置一個屬性:設置一個屬性

編輯時

class dummy: 
    def __nonzero__(self): 
     return False 
    def __setattr__(self, k, v): 
     return 


mydummy = dummy() 
mylist = [ins_1, ins_2, mydummy, ins_3, mydummy] 

什麼都不會被存儲到dummyinstances:

如果原始列表的內容不能選擇,那麼這個類可以幫助:

class PickyList(list): 
    def __init__(self, iterable, dummyval): 
     self.dummy = dummyval 
     return super(PickyList, self).__init__(iterable) 
    def __getitem__(self, k): 
     v = super(PickyList, self).__getitem__(k) 
     return (self.dummy if v is None else v) 



mylist = PickyList(ins_list, mydummy) 
0

在這種情況下,我會使用try-except語句,因爲EAFP(比權限更容易要求原諒)。它不會縮短代碼,但在檢查有效屬性時,它是一種更符合Pythonic的編碼方式。這樣你就不會違背DRY (別自責)

try: 
    if ins_list[ind].some_attribute == "thing": 
     # do_something() 
except AttributeError: 
    # do_something_else()