Python 为什么setattr不影响返回值?
我正在使用Python 为什么setattr不影响返回值?,python,closures,getattr,setattr,Python,Closures,Getattr,Setattr,我正在使用setattr()来修补一个闭包。使用getattr()显示已正确修补闭包。但是,返回值不受影响 >>> def foo(): ... def bar(): ... return('bar') ... return(bar()) ... >>> def baz(): ... return('baz') ... >>> setattr(foo, 'bar', baz) >>
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'
,就好像补丁从未出现过一样。它确实起了作用,只是没有如您所期望的那样:
f = foo.bar
print(f()) # baz
bar
是foo
中的嵌套函数;不是它的一个属性。据我所知,没有办法重新分配这样的内部功能
最好是有一个
foo
依赖的外部可访问变量,并根据需要重新分配该变量。或者给它一个可变的对象,让它在外部变为所需的状态。我不能说我会推荐这些选项,但考虑到当前的需求,它们应该会起作用 我不认为bar
是foo
的一个属性;它只是一个嵌套函数。您可能需要执行类似于从外部重新分配bar
使用的变量的操作。setattr(foo,'bar',baz)
为foo
创建一个属性-谢谢!是的,这似乎是答案。在setattr()之前使用getattr(foo,'bar')
抛出AttributeError
。所以foo
一开始没有属性bar
。使用setattr()
当然会给它一个。这是一个麻烦。有时,嵌套函数可以提供优雅的解决方案。但是,它们在测试过程中很难处理,例如,我可能需要为bar
注入依赖项。bar
方法必须以某种方式绑定到foo
。“但它是可以修补的吗?”JamesRowland不幸的是,我刚开始轮班。我回家后会调查的。我不认为有一种方法不需要事先手动设置一个机制。