我不知道这是否是 getattr
built_in 方法的预期行为。
getattr
也会执行默认的(第三个)参数,即使实际参数(第二个)满足条件。
示例:
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
有这样的行为,我们可以阻止他们这样做吗(如果有第二个参数,则不执行第三个参数),如果分享替代方法,我们将不胜感激Pythonic 方式。
首先想到的一件事是使用 hasattr
检查 param1
是否存在,然后执行必要的操作。
最佳答案
在执行 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
值。
关于python getattr 内置方法执行默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38589823/