2016-07-26 46 views
3

我不知道這是否是getattr built_in方法的預期行爲。 getattr也會執行默認(第3個)參數,即使實際參數(第2個)也滿足條件。 實施例:python getattr built_in方法執行默認參數

def func(): 
     print 'In Function' 

    class A: 
     def __init__(self): 
      self.param = 12 

    a = A() 

當運行getattr(a, 'param', Func())它給出結果。記下我不想要的In Function

In Function 
12 

但是,當我執行getattr(a, 'param1', func())即輸出

In Function 

但我只是想,如果滿足條件導致的12它完美的罰款。請讓我知道爲什麼getattr有這樣的行爲,我們可以阻止他們這樣做(即不執行第三個參數,如果有第二個參數),將不勝感激,如果分享以Pythonic方式做替代方式。 首先想到的一件事是檢查param1是否存在使用hasattr然後做必要的。

回答

5

在執行getattr之前,必須對所有傳遞的參數進行評估。 func()是這些參數之一,並且嘗試評估它將執行print語句。該屬性是否被發現,func()必須先評估。

這不是getattr所特有的,它是函數及其參數如何在Python中工作的。


考慮以下幾點:

>>> def does_nothing(any_arg): pass 
... 
>>> def f(): print("I'll get printed") 
... 
>>> 
>>> does_nothing(f()) 
I'll get printed 

功能does_nothing實際上什麼也不做與傳遞的參數。但是在函數調用可以通過之前必須對參數進行評估。


print聲明不過不會影響getattr結果;一種副作用。如果未找到屬性,則使用該函數的return值。

+0

我認爲這將是增加額外功能的開銷,相反,我認爲我應該使用'hasattr'檢查。不過謝謝。 – MaNKuR

+4

如果你不希望在'a'有attr'param'時評估'func()',你可以改爲:'getattr(a,'param',None)或func()'。 'or'後的任何有效代碼都變成* lazy *。 –

+0

謝謝@常健,這是很有用的把戲。我怎麼能錯過這個。 – MaNKuR