为什么 setattr 不影响 return 值?

Why does setattr not affect the return value?

我正在使用 setattr() 猴子修补闭包。使用 getattr() 表明闭包已正确修补。但是,return 值不受影响。

>>> 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() 到 return 'baz'; 但是,它 returns 'bar' 就好像补丁从未发生过一样。

它确实有效,只是不像你期望的那样:

f = foo.bar

print(f())  # baz

barfoo里面的嵌套函数;不是它的属性。据我所知,没有办法像这样重新分配内部函数。

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