我不知道这是否是getattr
built_in方法的预期行为。
即使实际参数(第2个)满足条件,getattr
也会执行默认(第3个)参数。
例如:
def func():
print('In Function')
class A:
def __init__(self):
self.param = 12
a = A()
当我运行getattr(a, 'param', func())
时,它会给出以下结果:
In Function
12
请注意我不想要的In Function
。
但是当我执行getattr(a, 'param1', func())
即输出
In Function
但如果满足条件,我只希望结果为12
。请让我知道为什么getattr
有这样的行为,我们可以阻止它们这样做(如果有第二个参数,那就不执行第三个arg),如果分享以Pythonic方式执行它的替代方法,将不胜感激。
首先要考虑的一件事是使用param1
检查hasattr
是否存在然后做必要的事情。
答案 0 :(得分:6)
在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
值。