python getattr built_in方法执行默认参数

问题描述:

我不知道这是否是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然后做必要的。

在执行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