【发布时间】:2019-09-12 16:28:14
【问题描述】:
我正在使用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',就好像补丁从未发生过一样。
【问题讨论】:
-
我不认为
bar是foo的属性;它只是一个嵌套函数。您可能必须执行类似外部重新分配bar使用的变量之类的操作。 -
setattr(foo, 'bar', baz)为foo- stackoverflow.com/questions/338101/… 创建一个属性 -
谢谢!是的,这似乎是答案。在
setattr()之前使用getattr(foo, 'bar')会引发AttributeError。所以foo起初没有bar属性。使用setattr()当然可以。
标签: python closures getattr setattr