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

标签 python python-2.7 getattr

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

相关文章:

python - 如何使用 __getattr__ 将方法委托(delegate)给属性?

Python多重继承: Number of arguments for class construction and __init__() method misaligned and resulting in TypeErrors

python - 为什么我不能接受客户?

python - 有最新版本的pyUIQ吗?

此python3代码的Python2版本用于编码

Python - 如何替换列表中的字符串?

Python 内部结构 - 对象如何了解全局变量?

android - XML解析获取属性值

python - 在python中获取类和实例的属性

python - 聚类时间序列时出现不规则/缺失数据