python getattr 内置方法执行默认参数

python getattr built-in method executes default arguments

我不知道这是否是 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 值。