2016-07-26 10 views
3

これは期待された動作であるかどうかわかりませんがgetattr built_inメソッドです。 getattrは、実際の引数(2nd)が条件を満たす場合でも、デフォルト(3rd)引数を実行します。 例: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がそのような振る舞いをしているのかを教えてください。そして、それをやめることをやめることができます(2番目の引数があれば3番目の引数を実行しません)。 まず、hasattrを使用してparam1が存在するかどうかを確認してから、必要があるかどうかを確認してください。

答えて

5

getattrが実行される前に、渡されたすべてのパラメータを評価する必要があります。 func()はこれらのパラメータの1つであり、評価しようとするとprint文が実行されます。属性が見つかるかどうかにかかわらず、func()をaprioriで評価する必要があります。

これは、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()'に変更できます。 'または'の後に有効なコードは* lazy *になります。 –

+0

ありがとう@ Chang.Jian、これは便利なトリックです。どのように私はこれを逃すことができる。 – MaNKuR

関連する問題