我正在使用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'
,就好像补丁从未发生过一样。
答案 0 :(得分:1)
它确实起作用了,只是没有达到您的期望:
f = foo.bar
print(f()) # baz
bar
是foo
中的嵌套函数;不是它的属性。据我所知,无法重新分配这样的内部函数。
您最好的可能是拥有一个foo
所依赖的外部可访问变量,然后根据需要重新分配该变量。或者给它一个可变的对象,您可以在外部将其突变为所需的状态。我不能说我会推荐这些选项,但是鉴于当前的要求,它们应该可以使用。