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

MaN*_*KuR 3 python getattr python-2.7

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

def func():
    print('In Function')

class A:
    def __init__(self):
        self.param = 12

a = A()
Run Code Online (Sandbox Code Playgroud)

当我运行getattr(a, 'param', func())它时给出这个结果:

In Function
12
Run Code Online (Sandbox Code Playgroud)

注意In Function我不想要的.

但是当我执行getattr(a, 'param1', func())ie输出时它完全正常

In Function
Run Code Online (Sandbox Code Playgroud)

但我只想要结果12好像满足了条件.请让我知道为什么getattr会有这样的行为,我们可以阻止他们这样做(如果有第二个参数,那就不是执行第三个arg),如果以Pythonic方式共享另一种方式,我将不胜感激.首先要记住的一件事是检查是否param1存在使用hasattr然后做必要的事情.

Mos*_*oye 8

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
Run Code Online (Sandbox Code Playgroud)

函数does_nothing实际上对传递的参数没有任何作用.但是必须在函数调用完成之前评估参数.


print然而,该声明不会影响结果getattr; 有点副作用.如果未找到该属性return,则使用该函数的值.

  • 如果你不想在`a`具有attr`param`时评估`func()`,你可以改为:`getattr(a,'param',None)或func()`."或"之后的任何有效代码变为*lazy*. (5认同)