序列化错误:无法序列化 <type 'function'>

5 投票
1 回答
11060 浏览
提问于 2025-04-18 14:32

我在想这个错误可能是什么意思:

PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

我知道这个错误和使用多个核心有关。我在一个集群上运行我的程序,并在我代码的这一行使用了15个线程:

gauss2 = PTSampler(ntemps, renwalkers, rendim, lnlike, lnprior, threads=15)

这里提到的采样器是关于并行温度采样器的,详细信息可以在这个链接找到:http://dan.iel.fm/emcee/current/user/pt/

你知道这个错误可能意味着什么吗?

1 个回答

5

这个错误的意思是你在尝试把一个内置的 FunctionType 对象进行序列化,而不是直接序列化函数本身。这很可能是因为你的代码哪里出错了,导致你拿到了函数的类别,而不是函数的内容。

>>> import sys
>>> import pickle
>>> import types
>>> types.FunctionType
<type 'function'>
>>> try:
...     pickle.dumps(types.FunctionType)
... except:
...     print sys.exc_info()[1]
... 
Can't pickle <type 'function'>: it's not found as __builtin__.function
>>> def foo(x):
...   return x
... 
>>> try:
...     pickle.dumps(type(foo))
... except:
...     print sys.exc_info()[1]
... 
Can't pickle <type 'function'>: it's not found as __builtin__.function
>>> try:
...     pickle.dumps(foo.__class__)
... except:
...     print sys.exc_info()[1]
... 
Can't pickle <type 'function'>: it's not found as __builtin__.function
>>> pickle.dumps(foo)
'c__main__\nfoo\np0\n.'
>>> pickle.dumps(foo, -1)
'\x80\x02c__main__\nfoo\nq\x00.'

如果你有一个 FunctionType 对象,那么你只需要获取这个类别中的一个实例,也就是像 foo 这样的函数。

撰写回答