在 exec() 中定义的回调期间关闭丢失

2023-12-28

这是我使用 Python 的第三天,所以请原谅新手的错误。这是我的工作代码。person.test()向老板注册回调,老板调用回调,一切正常。

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 and data未知,因此请致电self.woot(数据) fails.

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()

我也尝试编译(),但没有成功。有什么想法吗?我真的不想手动携带自我/数据的副本通过老板并返回,因为我现实生活中的代码要复杂得多。我真的需要一种方法来维持关闭。


如果你只通过locals(作为函数的全局数据),那么事情或多或少会起作用:

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, locals())

当然,如果你还需要全局变量,你可以将它们打包在一起:

def test(self, boss, data):
  namespace = globals().copy()
  local_copy = locals().copy()
  namespace.update(local_copy)
  x = 'def foo(): pass'
  exec(x, namespace)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 exec() 中定义的回调期间关闭丢失 的相关文章

随机推荐

  • oozie 中 Hive 操作的作业队列

    我有一个 oozie 工作流程 我正在提交所有配置单元操作
  • CXF Web 服务客户端:“无法创建安全的 XMLInputFactory”

    我使用说明编写了 CXF Web 服务并将其部署到 Tomcat 服务器中here http www ibm com developerworks webservices library ws devaxis2part3 section3
  • Google Apps 脚本 - Gmail,永久删除垃圾箱中带有特定标签的电子邮件

    我正在尝试制作一个脚本 自动立即永久删除某个发件人的电子邮件 因为 Gmail 只允许过滤器将电子邮件发送到垃圾箱 30 天 请不要建议默认过滤器就足够了 就我的情况而言 重要的是我不知道我是从该发件人发送的电子邮件 我当前的脚本如下所示
  • 使用 rtweet get_timeline() 避免速率限制

    有没有办法阻止我的循环被速率限制打断 如果可能的话 我希望我的代码等待执行 直到时间限制过去 附带问题 我考虑过并行化 for 循环 你认为这是个好主意吗 我不确定是否有机会将数据写入错误的文件 library rtweet create
  • 如何使标签多行?

    我想知道是否可以制作一个
  • 将泛型中的 @SuppressWarnings("unchecked") 添加到单行会生成 eclipse 编译器错误

    我偶然发现了一种我不理解的奇怪行为 我必须将字符串转换为泛型 它会产生警告 Type safety Unchecked cast from String to T 如果我添加 SuppressWarnings unchecked 方法声明上
  • 如何从活动视图 Laravel 生成 PDF

    I have a search box when user input roll no it returns the specific student result I want to generate PDF of that search
  • 使用 MEF 时 Type.GetType 返回 null

    我目前正在使用 MEF 来导入插件的项目 因为插件是用 WPF 编写的 它们每个都有一个视图和一个视图模型 插件了解视图模型 但主 shell UI 将使用约定优于配置类型模式来构造视图并绑定视图模型 我使用了 Build your own
  • XSD 需要 XML 文档中存在特定的根元素吗?

    我想验证一个 XML 文件并确保它有一个名为的根元素speak像这样
  • 如何在 iOS 中创建不属于 Unicode 的下标字符

    我已经尝试创建一个带有下标字符的 NSString 一段时间了 但没有成功 在 iOS 中是否可以做到这一点 我需要一种方法将字符串中的字符更改为下标或上标 但我无法为此使用 Unicode 因为 Unicode 不包含所有字母 我的猜测可
  • 何时决定在java中使用静态函数[重复]

    这个问题在这里已经有答案了 何时决定使用静态函数 当我的函数仅在同一个类中调用时 是否需要将其设为静态 作为搜索 我找不到完整清晰的声明 静态方法或变量不仅仅是一个对象的一部分 它们是与声明类相同类型的所有实例的一部分 当您在类中将函数声明
  • “str”对象没有属性“get”

    我正在研究 Django 中的 Braintree 集成 我已经关注了本指南 https www braintreepayments com docs python guide getting paid 但是 我收到错误 str objec
  • 更改 Tomcat Web 应用程序上下文

    我有一个网络应用程序 它是在根上下文 下设计并始终工作的 所以所有css js和链接开头 例如 css style css 现在我需要将此 Web 应用程序移动到一些不同的上下文 比方说 app1 很容易改变server xml配置文件并在
  • 为什么要指定函数返回类型?

    大多数时候我读到我们应该尽可能多地使用类型推断 当编写函数时 我知道我们必须输入参数 因为它们无法推断 但为什么我们必须输入返回值 TypeScript 正在处理这个问题 显式键入函数的返回值有什么好处 到目前为止 我只读到我应该这样做 但
  • Delphi 2006 不允许在记录方法中使用记录类型的 const 参数?

    UPDATE 简单的解决方法 方法 运算符字段之前的数据字段 今天我尝试使用我能做的最简单的例子来重现这个错误 我从一个基本记录 TBasicRecord 开始 只有简单的设置和打印方法 没有运算符 并且传递 const x TBasicB
  • 如何查找 FileField Django 图像的高度和宽度

    如果我们的模型定义如下 如何找到图像的高度和宽度 class MModel document FileField format type CharField 并且图像保存在文档中 那么如果它是图像 我们如何找到文档的高度和宽度 如果文件始终
  • AWS CodePipeline:在 CodeBuild 中获取 CloudFormation 输出

    我正在使用 AWS CodePipeline Cloudformation 和 CodeBuild 学习一些开发运营技术 我的 简化的 管道是这样的 推送到 github 存储库会触发管道 CloudFormation 构建 更新后端基础设
  • 如何在Python中获取视频文件的方向

    我想将视频文件的帧加载到 numpy 数组中 我希望帧正确直立 这意味着我需要读取视频文件中的方向元数据 并相应地旋转加载的帧 我有一种加载帧的方法 opencv 的 python 绑定 所以我需要的是一种读取视频文件的方向元数据的方法 我
  • 在 Angular2 组件样式表中覆盖 Bootstrap 中的样式

    我有一个 Angular2 应用程序 使用 Angular CLI 构建 其中包含多个组件 每个组件都有一个引用的样式表 scss 这些样式表中的独特样式已正确应用于组件模板 我不能做的是覆盖来自外部 CSS 的样式 这些样式包含在这些组件
  • 在 exec() 中定义的回调期间关闭丢失

    这是我使用 Python 的第三天 所以请原谅新手的错误 这是我的工作代码 person test 向老板注册回调 老板调用回调 一切正常 class Boss def registerCallback self cb self cb cb