如何调用编译后的函数体?

2023-12-07

当我掌握一个代码对象时(通过内部结构,例如.func_code or __code__在Python 3)中,有什么办法calling这段代码?简单地调用它是行不通的:

def f(): pass

f.func_code()

结果是

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'code' object is not callable

当您想对嵌套函数进行单元测试时,这会派上用场:

def f():
  def g():
    return 3
  f.x = g
  return g() + 1

f.func_code.co_consts[1]

结果是

<code object g at 0x7f123991b930, file "<stdin>", line 2>

当然,这段代码仍然需要上下文等,但这不是我的问题。


One can eval() or exec them.

如果他们有自由变量(例如,对于其外部函数具有在嵌套函数之前定义的局部变量的嵌套函数的代码),这不是直接可能的(eval or exec提出一个TypeError在这种情况下)。

此外,无法直接将参数传递给代码。

但是我们可以为给定的代码即时创建一个包装函数。该函数通常可以被调用(使用f(…)),以通常的方式传递参数。这是使用完成的types.FunctionType。为了实现参考自由变量,必须使用一种技巧才能获得 Python 所期望的正确数据类型。请参阅下面的代码示例:

def f(v1=1):
  v2 = 2
  def g(v3=4):
    return v1 + v2 + v3 + 8
  return g() + 16

def freeVar(val):
  def nested():
    return val
  return nested.__closure__[0]

def nested(outer, innerName, **freeVars):
  if isinstance(outer, (types.FunctionType, types.MethodType)):
    outer = outer.func_code
  for const in outer.co_consts:
    if isinstance(const, types.CodeType) and const.co_name == innerName:
      return types.FunctionType(const, globals(), None, None, tuple(
          freeVar(freeVars[name]) for name in const.co_freevars))

nestedG = nested(f, 'g', v1=1, v2=2)
print nestedG(4)  # will print 15
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何调用编译后的函数体? 的相关文章

随机推荐

  • 具有 DateTimeField 和 timedelta 默认值的 Django 迁移

    我在设置默认值时遇到问题datetime在我的 Django 模型之一上 from django db import models from django utils import timezone class MyModel models
  • System.Drawing 的撤消按钮?

    我正在制作一个图像编辑器 有点为了自己的享受 并且想知道如何制作一个撤消按钮来撤消我上次所做的绘画 我想知道我会如何处理这个问题 教程或示例代码会很好 或者至少能指引我正确的方向 Thanks 呵呵 撤消实际上并不像听起来那么难 这里的神奇
  • 比较双精度数返回 false

    我的数据库中有三个数字 想要在 if 语句中比较它们 我有一个简单的 convert 函数 仅返回双精度数 Public Function RetDbl ByVal obj As Variant As Double On Error Res
  • 设置在 Foreach 循环中默认选中的 RadioButtonFor()

    我有一个奇怪的行为使用 Html RadioButtonFor扩展方法 我正在使用 foreach 循环创建 RadioButton 和 By 三元运算符的列表 我试图将尊重条件的人设置为检查 但它总是最后一个被检查的人 我搜索了类似的问题
  • 如何创建类似于 Twitter 应用程序位置切换按钮的切换按钮?

    我应该使用什么自定义按钮 可以左右滑动 例如 Android 的 Twitter 应用程序上的打开 关闭位置按钮 如下图所示 还有创建此类按钮的任何链接或指南 Thanks 使用一个简单的切换按钮结合一个可绘制状态列表设置为其背景 的一个样
  • 如何在R包RecordLinkage中使用compare.linkage——意外的输出

    我正在使用R包RecordLinkage中的compare linkage函数 得到的结果我知道是错误的 所以我知道我误解了一些东西 我正在使用适用于 x64 Windows 的 R 3 2 3 我对 Stata 非常熟悉 但对 R 不太熟
  • 在 Powershell 中计算日志结果

    我有一项任务 必须从 Windows 安全日志文件中提取 审核失败 和 审核成功 等信息 并计算每个 ex 的结果 总尝试次数 成功次数 失败次数和最常见的事件 ID 我将 csv 保存到桌面以获取信息 但我不确定如何获取每个文件的运行总计
  • 有关 Django 中字段类型的问题

    我是 Django 新手 我想在 Django 中制作一个用户注册表单 创建模型时 我为密码字段提供了 fieldtype gt PasswordField 但是当我将此模型运行到终端时出现错误 password models Passwo
  • Angular 2 - 如何将数据传递给子组件而不渲染子组件两次?

    我想将一个对象从 app component 传递到子组件 home component 我是否使用了错误的路由方式 这就是为什么我想要将对象传递给的子组件被渲染两次 我怎样才能避免它 我想这也可能是第二次渲染组件时该对象未定义的原因 我已
  • Magento 1.9.2.1 自定义模块 404

    我最近安装了 Magento 的干净版本 我有一个自定义模块 它在旧模块上运行得很好 但在新模块上却不起作用 都是 1 9 2 1 它显示在 系统 gt 配置 gt 高级 gt 高级 下 每当我尝试调用 mydomain index php
  • 如何解决“参数必须是实现 Countable 的数组或对象?” [复制]

    这个问题在这里已经有答案了 警告 count 参数必须是数组或对象 在 C xampp htdocs try process php 第 30 行实现 Countable 这就是我的代码所说的 看起来很好 但是当我按编辑时 会显示此错误 我
  • 如果声明但未初始化对象的变量是否会使用内存空间?

    我有一个类 我想使用大约十到十万个 因此 我不想不必要地浪费内存位置 仅在其中少数 如果是 我是否还有其他选择 除了将它们作为自己的类之外 来减少内存使用 这是我的代码示例 name and propability我只需要几次 public
  • 为什么我收到 java.lang.AbstractMethodError 错误?

    ABstractMethodError 的可能原因有哪些 线程 pool 1 thread 1 中的异常java lang AbstractMethodError org apache thrift ProcessFunction isOn
  • 返回 Excel VBA 宏 OneDrive 本地路径 - 可能的线索

    我有一个许多人需要访问的电子表格 在共享点上 出于某些原因 我们需要在本地执行此操作 同步 然而 由于每个用户的知识水平 不断出现问题和错误 电子表格需要具有结构和一致性 因此为了实现这一点 我创建了一个带有一组参数的用户表单 以帮助人们输
  • 如何测量应用程序或进程的实际内存使用情况?

    如何测量 Linux 中应用程序或进程的内存使用情况 摘自博客文章了解 Linux 上的内存使用情况 ps不是用于此目的的准确工具 Why ps是错的 取决于你如何看待它 ps不报告进程的实际内存使用情况 它真正做的是显示每个进程将占用多少
  • TFS 2015:发布工件 - “任务已取消”

    不久之后 我在运行构建任务 发布工件 时收到 任务已取消 tfs 服务器现在已经运行了几周 我在执行这些任务时从未遇到过问题 我通过删除构建输出文件夹解决了这个问题 但不幸的是这个 解决方法 不再起作用 我尝试更改工件名称 希望这可以改变一
  • 如何使用正则表达式从字符串中删除最后一个逗号和空格(如果有)?

    我在 C 应用程序中有一个字符串 想知道检查最后两个字符是否是的正确方法是什么 逗号和空格 并使用正则表达式删除它们 如果是 没有正则表达式的工作解决方案 string str dfsf if str EndsWith str str Re
  • Boost.Process - 如何让进程运行一个函数?

    所以我尝试做一些事情升压过程尽管它尚未被 Boost 发行版接受 最简单的程序看起来像 include
  • 读取用户会话时出现 HttpRuntime CacheInternal NULL 引用异常(反射)

    在我们的 Windows 服务器 2008R2 2012 上进行一些更新后 Asp net 应用程序抛出错误 var obj 1 typeof HttpRuntime GetProperty CacheInternal BindingFla
  • 如何调用编译后的函数体?

    当我掌握一个代码对象时 通过内部结构 例如 func code or code 在Python 3 中 有什么办法calling这段代码 简单地调用它是行不通的 def f pass f func code 结果是 Traceback mo