我正在尝试运行以下代码:
import pickle
def foo():
print("i am foo")
pickle_foo = pickle.dumps(foo)
def foo():
print("i am the new foo")
fkt = pickle.loads(pickle_foo)
return fkt()
foo()
预期的行为是:
i am the new foo
i am foo
实际情况是:
RecursionError: maximum recursion depth exceeded while calling a Python object
当两个函数的名称不同时,不会发生错误,但对于我的项目来说,这是非常不实际的。 有人能解释一下,为什么会发生这种行为,以及如何避免它(在不更改函数名的情况下)
pickle
模块根据函数的完全限定名引用对函数进行pickle。这意味着,如果您的函数在代码中的某个地方被重新定义,然后您取消对它的pickle引用,那么调用它将导致对新定义的调用从
pickle
上的Python docs:但是,您可以使用
inspect.getsource()
检索函数的源代码,并对其进行pickle。这要求您的代码可以作为文件系统中某个地方的源代码使用,因此导入的编译C代码或其他外部源(解释器输入、动态加载的模块)将无法工作取消勾选时,可以使用
exec
将其转换为函数并执行注意:这将每次重新定义
foo
,因此不能保证对foo
的调用具有相同的效果注2:
exec
是不安全的,通常不适合与外部源交互的代码。确保保护对exec
的调用不受试图执行任意代码的潜在外部攻击相关问题 更多 >
编程相关推荐