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

python getattr内置方法执行默认参数,python,python-2.7,getattr,Python,Python 2.7,Getattr,我不知道这是否是getattr内置方法的预期行为。 getattr即使实际参数(第2个)满足条件,也会执行默认(第3个)参数。 例如: 当我运行getattr(一个'param',func())时,它给出以下结果: In Function 12 注意我不想要的函数中的 但是当我执行getattr(一个'param1',func())I.e.output时,它工作得非常好 In Function 但是如果满足条件,我只希望结果为12。请让我知道为什么getattr有这样的行为,我们能阻止他们这

我不知道这是否是
getattr
内置方法的预期行为。
getattr
即使实际参数(第2个)满足条件,也会执行默认(第3个)参数。 例如:

当我运行
getattr(一个'param',func())
时,它给出以下结果:

In Function
12
注意我不想要的函数中的

但是当我执行
getattr(一个'param1',func())
I.e.output时,它工作得非常好

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
函数
不执行任何操作
实际上对传递的参数不执行任何操作。但是在函数调用完成之前,必须对参数进行求值



但是,
print
语句不会影响
getattr
的结果;有点副作用。如果未找到属性,则使用函数的
返回值。

我认为这将是添加额外函数的开销,相反,我认为应该使用
hasattr
检查。尽管如此,谢谢。如果您不想在
a
具有attr
param
时计算
func()
,您可以更改为:
getattr(a,'param',None)或func()
之后的任何有效代码都会变懒。谢谢@Chang.Jian,这是一个有用的技巧。我怎么会错过这个,它不是完全相等的。如果
之前的值为falsy,如0或False,则
之后的代码也将运行
>>> def does_nothing(any_arg): pass
...
>>> def f(): print("I'll get printed")
...
>>>
>>> does_nothing(f())
I'll get printed