【问题标题】:Why does setattr not affect the return value?为什么 setattr 不影响返回值?
【发布时间】: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',就好像补丁从未发生过一样。

【问题讨论】:

  • 我不认为barfoo的属性;它只是一个嵌套函数。您可能必须执行类似外部重新分配 bar 使用的变量之类的操作。
  • setattr(foo, 'bar', baz)foo - stackoverflow.com/questions/338101/… 创建一个属性
  • 谢谢!是的,这似乎是答案。在setattr() 之前使用getattr(foo, 'bar') 会引发AttributeError。所以foo 起初没有bar 属性。使用setattr() 当然可以。

标签: python closures getattr setattr


【解决方案1】:

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

f = foo.bar

print(f())  # baz

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

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

【讨论】:

  • 这太糟糕了。有时嵌套函数可以提供优雅的解决方案。但是,它们在测试期间很难处理,例如,我可能想要为 bar 注入依赖项。 bar 方法必须以某种方式绑定到 foo。但它可以修补吗?
  • @JamesRowland 不幸的是,我刚开始轮班。我回家后会调查这个。不过,我认为没有事先手动设置机制的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 2018-11-05
  • 2017-02-27
  • 1970-01-01
  • 2017-01-13
  • 2010-11-28
相关资源
最近更新 更多