为什么 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
bar
是foo
里面的嵌套函数;不是它的属性。据我所知,没有办法像这样重新分配内部函数。
你最好的办法可能是拥有一个 foo
依赖的外部可访问变量,并根据需要重新分配它。或者给它一个可变对象,您可以在外部将其突变为所需状态。我不能说我会推荐这些选项,但考虑到当前的要求,它们应该可以工作。
我正在使用 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
bar
是foo
里面的嵌套函数;不是它的属性。据我所知,没有办法像这样重新分配内部函数。
你最好的办法可能是拥有一个 foo
依赖的外部可访问变量,并根据需要重新分配它。或者给它一个可变对象,您可以在外部将其突变为所需状态。我不能说我会推荐这些选项,但考虑到当前的要求,它们应该可以工作。