正如其他答案已经指出的,您应该考虑重构代码。在
我说了,如果没有异常的话,我就不能一起执行你的功能。在import ast, _ast, compiler
def fail():
print "Hello, World!"
raise Exception
x = [4, 5]
print x
if __name__ == '__main__':
with open(__file__, 'r') as source:
tree = ast.parse(source.read(), __file__)
for node in ast.iter_child_nodes(tree):
if isinstance(node, _ast.FunctionDef):
_locals = {}
for line in node.body:
mod = ast.Module()
mod.body = [line]
try:
exec(compile(mod, filename='', mode='exec'), _locals, globals())
except:
import traceback
traceback.print_exc()
代码执行它在全局范围内找到的任何函数,并防止它在失败时退出。它通过迭代文件的AST来实现,并为函数的每一行创建一个新的模块来执行。在
如您所料,程序的输出是:
^{pr2}$
我要强调的是,在任何生产代码中使用这一点都是个坏主意。但是为了争论,这样的事情是可行的。你甚至可以用一个很好的装饰器来包装它,尽管这样做并不能改变这是一个坏主意的事实。在
重构快乐!在