今天是我使用Python的第三天,所以请原谅新手的错误。这是我的工作代码。你知道吗个人测试()向老板注册回调,老板调用回调,一切正常。你知道吗
class Boss:
def registerCallback(self,cb):
self.cb = cb
def doCallback(self):
self.cb()
class Person:
def woot(self,data):
print("Woot! ",data)
def test(self,boss,data):
def callback ():
self.woot(data)
boss.registerCallback(callback)
boss = Boss()
person = Person()
person.test(boss,1)
boss.doCallback()
但是,如果将回调移到exec()中,则闭包将丢失。回调运行,但是self和data未知,因此调用自拍(数据)失败。你知道吗
class Boss:
def registerCallback(self,cb):
self.cb = cb
def doCallback(self):
self.cb()
class Person:
def woot(self,data):
print("Woot! ",data)
def test(self,boss,data):
x = "def callback():\n self.woot(data)\nboss.registerCallback(callback)"
exec(x,globals(),locals())
boss = Boss()
person = Person()
person.test(boss,1)
boss.doCallback()
我也试过编译(),没有运气。有什么想法吗?我真的不想手动将self/数据的副本通过boss传递回来,因为我的实际代码要复杂得多。我真的需要一个方法来保持关闭。你知道吗
为什么当前代码失败?
self
是callback
的自由变量,如果您阅读^{现在从^{} 的文档来看:
因此,当我们将两个不同的对象传递给
exec()
时,locals()
字典对于callback()
实际上是空的,因为它不能再访问自由变量,因此传递locals()
和globals()
的合并版本的solution suggested by @mgilson应该为您做这件事。你知道吗如果只传递
locals
(作为函数的全局数据),那么事情或多或少会起作用:当然,如果您也需要globals,您可以将它们打包在一起:
相关问题 更多 >
编程相关推荐