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
值。
我认为这将是增加额外功能的开销,相反,我认为我应该使用'hasattr'检查。不过谢谢。 – MaNKuR
如果你不希望在'a'有attr'param'时评估'func()',你可以改为:'getattr(a,'param',None)或func()'。 'or'后的任何有效代码都变成* lazy *。 –
谢谢@常健,这是很有用的把戏。我怎么能错过这个。 – MaNKuR