为什么setattr不影响返回值?

时间:2019-09-12 16:28:14

标签: python closures getattr setattr

我正在使用setattr()来修补闭包。使用getattr()表示关闭已正确修补。但是,返回值不受影响。

>>> def foo():
...     def bar():
...             return('bar')
...     return(bar())
... 
>>> def baz():
...     return('baz')
... 
>>> setattr(foo, 'bar', baz)
>>> bar = getattr(foo, 'bar')
>>> bar()
'baz'
>>> foo()
'bar'

使用setattr()之后,我希望foo()返回'baz'; 但是,它会返回'bar',就好像补丁从未发生过一样。

1 个答案:

答案 0 :(得分:1)

它确实起作用了,只是没有达到您的期望:

f = foo.bar

print(f())  # baz

barfoo中的嵌套函数;不是它的属性。据我所知,无法重新分配这样的内部函数。

您最好的可能是拥有一个foo所依赖的外部可访问变量,然后根据需要重新分配该变量。或者给它一个可变的对象,您可以在外部将其突变为所需的状态。我不能说我会推荐这些选项,但是鉴于当前的要求,它们应该可以使用。