2016-03-03 12 views
1

我的問題是,什麼是更Python:使用GETATTR或內嵌if語句檢索默認值

以下哪個是更Python的:

getattr(object, field, None) VS object.field if object else None

我的偏向如果語句,因爲getattr似乎假定一個對象實際上存在,我們正在檢查該字段是否存在。這不是我們想要完成的。

此外,當基準測試:if語句始終快4倍。

編輯:

如果它不是很明顯,這是僞代碼。

+6

這些不是等同的陳述。第一個返回對象的字段屬性。如果field屬性不存在,則返回None。如果對象是真的,則返回對象的字段屬性。否則它返回None。 – Alex

+1

「getattr似乎認爲一個對象確實存在,我們正在檢查該字段是否存在,這不是我們正在努力完成的任務」 - 那麼你試圖完成什麼? 'getattr'代碼對於它的目標用例非常有意義。 – user2357112

+0

它們的返回值相同。它們將返回對象上字段的值,否則它們將返回None。假設對象具有標準的getattr方法。 – zkazanski

回答

1

好的我必須在答案中輸入它,因爲它超過了註釋字符限制。正如我在評論中提到的那樣,這兩個陳述並不相同。

設置

class A(object): 
    def __init__(self, attr_name): 
     setattr(self, attr_name, 'hi') 

a1 = A('my_attr') 
a2 = A('other_attr') 

下面是對getattr陳述的案件。

getattr(a1, 'my_attr', None) # evaluates to 'hi' 

getattr(a2, 'my_attr', None) # evaluates to None 

getattr(a3, 'my_attr', None) # raises NameError 

下面是三元語句的情況。

a1.my_attr if a1 else None # evaluates to 'hi' 

a2.my_attr if a2 else None # raises AttributeError 

a3.my_attr if a3 else None # raises NameError 

第二種情況在兩種制度下是不同的。

此外,如果A的實例評估爲False,則兩種制度可以以不同的方式有所不同。

class A(object): 
    def __init__(self, attr_name): 
     setattr(self, attr_name, 'hi') 
    def __bool__(self): 
     return False 

a1 = A('my_attr') 
a2 = A('other_attr') 

getattr報表同樣地進行評價,但三元語句現在評價如下:

a1.my_attr if a1 else None # evaluates to None 

a2.my_attr if a2 else None # evaluates to None 

a3.my_attr if a3 else None # raises NameError 

現在第一種情況是兩種體制下的不同。