我想处理一个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(使用前将#替换为@)