处理异常后如何从上次尝试的指令继续执行帧?

2024-04-29

我想处理一个NameError通过将所需的缺失变量注入到帧中,然后从上次尝试的指令继续执行来抛出异常。

下面的伪代码应该可以说明我的需求。

def function():
    return missing_var

try:
    print function()

except NameError:

    frame = inspect.trace()[-1][0]

    # inject missing variable
    frame.f_globals["missing_var"] = ...

    # continue frame execution from last attempted instruction
    exec frame.f_code from frame.f_lasti

在 repl.it 上阅读整个单元测试 https://repl.it/BaLF/1

Notes

  • 正如所指出的伊万·波兹杰耶夫 https://stackoverflow.com/users/648265/ivan-pozdeev in his answer https://stackoverflow.com/a/34426352/2594884,这被称为恢复.
  • 经过更多研究,我发现Veedrac https://stackoverflow.com/users/1763356/veedrac's answer https://stackoverflow.com/a/18956602/2594884对这个问题使用自定义 sys.excepthook 在发生异常之前的上下文中的行号处恢复程序 https://stackoverflow.com/questions/18887163/python-resuming-program-at-line-number-in-the-context-before-an-exception-using发布者lc2817 https://stackoverflow.com/users/988828/lc2817很有意思。它依赖于里奇·辛德尔的work http://entrian.com/goto/.

背景

该代码在从属进程中运行,该从属进程由父进程控制。任务(实际上是函数)写在父进程中,然后使用以下方法传递给从进程dill https://pypi.python.org/pypi/dill。我希望某些任务(在从属进程中运行)尝试从父级的外部范围访问变量,并且我希望从属向父级动态请求这些变量。

p.s.:我不希望这个魔法在生产环境中运行。


与各种评论者所说的相反,“错误时恢复”异常处理is在Python中是可能的。图书馆fuckit.py https://github.com/ajalt/fuckitpy实施上述战略。它通过在导入时重写模块的源代码来消除错误,插入try...except每个语句周围都有块 https://github.com/ajalt/fuckitpy/blob/master/fuckit.py#L73并吞掉所有例外。那么也许你可以尝试类似的策略?

不言而喻:那个图书馆只是一个笑话。永远不要在生产代码中使用它。


您提到您的用例是捕获对丢失名称的引用。您是否考虑过使用元编程在“智能”命名空间(例如defaultdict? (这也许只是比一个坏主意稍微好一点fuckit.py.)

from collections import defaultdict

class NoMissingNamesMeta(type):
    @classmethod
    def __prepare__(meta, name, bases):
        return defaultdict(lambda: "foo")

class MyClass(metaclass=NoMissingNamesMeta):
    x = y + "bar"  # y doesn't exist

>>> MyClass.x
'foobar'

NoMissingNamesMeta is a 元类 https://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python- 用于定制行为的语言构造class陈述。这里我们使用的是__prepare__方法来自定义字典,该字典将在创建类期间用作类的命名空间。因此,因为我们使用的是defaultdict一个类,其元类是NoMissingNamesMeta永远不会得到NameError。创建类期间引用的任何名称都将自动初始化为"foo".

这种方法类似于 @AndréFratelli 手动请求延迟初始化数据的想法Scope目的。在生产中我会这样做,而不是这样做。元类版本需要更少的输入来编写客户端代码,但代价是更多的魔法。 (想象一下你自己在两年内调试这段代码,试图理解为什么不存在的变量被动态地引入作用域!)

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

处理异常后如何从上次尝试的指令继续执行帧? 的相关文章

  • 为什么 matplotlib 底图没有绘制地图中某些区域的颜色?

    下面的代码应该为越南的所有州着色 import pandas as pd import matplotlib pyplot as plt from mpl toolkits basemap import Basemap fig ax plt
  • Python 函数句柄 ala Matlab

    在 MATLAB 中可以创建function handles http www mathworks co uk help techdoc ref function handle html与类似的东西 myfun arglist body 这
  • Pygame 让精灵按照给定的旋转行走

    很久以前我做了一个Scratch脚本 我想用Pygame将其转换为Python 有很多示例显示图像的旋转 但我想知道如何更改精灵的旋转以使其沿给定方向移动 而不更改图像 这是我的暂存代码 这是我的 Pygame 精灵类 class Star
  • 如何生成大型网站的图形站点地图[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想为我的网站生成图形站点地图 据我所知 有两个阶段 抓取网站并分析链接关系 提取树形结构 生成视觉上
  • Scrapy Splash,如何处理onclick?

    我正在尝试抓取以下内容 我能够收到响应 但我不知道如何访问以下项目的内部数据以抓取它 我注意到访问这些项目实际上是由 JavaScript 和分页处理的 这种情况我该怎么办 下面是我的代码 import scrapy from scrapy
  • Django 说“id 可能不为 NULL”,但为什么会这样呢?

    我今天要疯了 我只是尝试插入一条新记录 但它返回了 post blogpost id 可能不为 NULL 错误 这是我的模型 class BlogPost models Model title models CharField max le
  • 将相同的 Patch 实例添加到 matplotlib 中的多个子图中

    我正在尝试将补丁的相同实例添加到 matplotlib 中的多个轴 这是最小的例子 import matplotlib pyplot as mpl plt import matplotlib patches as mpl patches f
  • 从 Spark 数据帧中过滤大量 ID

    我有一个大型数据框 其格式类似于 ID Cat date 12 A 201602 14 B 201601 19 A 201608 12 F 201605 11 G 201603 我需要根据大约 500 万个 Is 的列表来过滤行 最直接的方
  • 如何解决CDK CLI版本不匹配的问题

    我收到以下错误 此 CDK CLI 与您的应用程序使用的 CDK 库不兼容 请将CLI升级到最新版本 云程序集架构版本不匹配 支持的最大架构版本为 8 0 0 但发现为 9 0 0 发出后cdk diff命令 我确实跑了npm instal
  • 检查列表是否已排序的 Pythonic 方法

    有没有一种Python式的方法来检查列表是否已经排序ASC or DESC listtimestamps 1 2 3 5 6 7 就像是isttimestamps isSorted 返回True or False 我想输入一些消息的时间戳列
  • Scapy:如何将新层(802.1q)插入现有数据包?

    我有一个数据包转储 想要将 VLAN 标记 802 1q 标头 注入到数据包中 怎么做 为了找到答案 我查看了Scapy 插入新层和记录问题 https stackoverflow com q 17259592 1381638 这确实很有帮
  • Python 中使用 globals() 的原因?

    Python 中有 globals 函数的原因是什么 它只返回全局变量的字典 这些变量已经是全局的 所以它们可以在任何地方使用 我只是出于好奇而问 试图学习Python def F global x x 1 def G print glob
  • python lxml 使用iterparse编辑并输出xml

    我已经在 lxml 库上摆弄了一段时间了 也许我没有正确理解它 或者我错过了一些东西 但我似乎无法弄清楚在捕获某个 xpath 后如何编辑文件并且然后能够在逐个元素解析时将其写回到 xml 中 假设我们有这个 xml 作为示例
  • 使用 os.forkpty() 创建一个伪终端以 ssh 到远程服务器并与其通信

    我正在尝试编写一个 python 脚本 它可以 ssh 到远程服务器 并可以从 python 客户端执行 ls cd 等简单命令 但是 在成功 ssh 到服务器后 我无法读取伪终端的输出 任何人都可以在这里帮助我 以便我可以在服务器上执行一
  • 如何在自定义 django 命令中抽象出命令代码

    我正在我的应用程序下编写自定义 django 命令management commands目录 目前我在该目录中有 6 个不同的文件 每个文件都有不同的命令来解决独特的需求 然而 有一些实用程序是它们所共有的 抽象出这些公共代码的最佳方法是什
  • 如何使用 Python 实现并行 gzip 压缩?

    使用python压缩大文件 https stackoverflow com questions 9518705 big file compression with python给出了一个很好的例子来说明如何使用例如bz2 纯粹用 Pytho
  • 如何输入可变的默认参数

    Python 中处理可变默认参数的方法是将它们设置为无 https stackoverflow com a 366430 5049813 例如 def foo bar None bar if bar is None else bar ret
  • scikit-learn kmeans 聚类的初始质心

    如果我已经有一个可以作为初始质心的 numpy 数组 我该如何正确初始化 kmeans 算法 我正在使用 scikit learn Kmeans 类 这个帖子 具有选定初始中心的 k 均值 https stackoverflow com q
  • 如何对每一行进行 value_counts 并创建一些列,其值是每个值的计数

    我得到一个数据框如下 df c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 r1 0 1 1 1 1 0 0 0 0 0 0 0 r2 1 2 2 2 2 1 1 1 1 0 0 0 r3 1 0 2 0 0
  • 如何从Python枚举类中获取所有值?

    我正在使用 Enum4 库创建一个枚举类 如下所示 class Color Enum RED 1 BLUE 2 我要打印 1 2 作为某处的列表 我怎样才能实现这个目标 您可以执行以下操作 e value for e in Color

随机推荐