gpt4 book ai didi

python - python 中的 Pickle 和 exec

转载 作者:行者123 更新时间:2023-11-30 23:09:30 24 4
gpt4 key购买 nike

大家好!

我要做的是:

import pickle

exec "def f(): print 'Hi!'"
code = pickle.dumps(f)

print code

正如你所看到的,它工作得很好。

但是,为了避免定义全局变量(例如前面代码中的 f),我想做这样的事情:

import pickle

d = {}
exec "def f(): print 'Hi!'" in d
d['f']()

code = pickle.dumps(d['f'])
print code

它打印“Hi!”,这意味着 python 将 d['f'] 识别为函数,但无法对其进行 pickle。

您知道如何执行此操作吗?我认为这是因为在前一种情况下,python知道在哪里找到该函数(它在'__main__'中),但在后一种情况下,它在位于'__main__'的字典中我认为如果你可以告诉python该功能的真正模块方向,它将起作用。

谢谢!

最佳答案

pickle根据名称 pickle 的功能。它没有尝试转储和恢复字节码,而是只是说“好吧,这个函数是 __main__.f ,所以要取消它,请查看 __main__ 模块并检索名为 f 的东西”。这是非常有必要的;如果你 unpickle 一个函数 f在解释器环境中 f不存在或做了不同的事情,那么为了保留未 pickle 函数的原始行为,您需要以某种方式保留它引用的所有函数,它使用的所有模块,所有不再存在的全局变量等等。您需要确保递归引用 f里面f使用 unpickled 函数代替新解释器的 f ,这一切都变得一团糟。

重点是,pickle 函数必须是全局的。如果您查看其 __module__ 指定的模块并寻找由其 __name__ 命名的东西,你必须找到这个函数,否则你无法解开它。因此,您不能exec假全局字典中的函数定义,以及执行您想要 pickle 的函数的定义是一种非常容易出错的操作。

关于python - python 中的 Pickle 和 exec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31191947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com