【问题标题】:Pickling error: Can't pickle <type 'function'>酸洗错误:不能酸洗 <type 'function'>
【发布时间】:2014-09-15 09:15:39
【问题描述】:

我想知道这个错误可能意味着什么:

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/ 上记录的 Parallel Tempering 采样器

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

【问题讨论】:

标签: python numpy multiprocessing pickle core


【解决方案1】:

这个错误意味着你试图腌制一个内置的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 这样的函数。

【讨论】:

  • 如果你想pickle一个类怎么办?
  • 如果类是用户构建的,它们往往可以工作,但是它们通过引用腌制,因此存在一些限制(例如,它们最好导入)。你可以试试dill,它让酸洗课变得更容易了。
  • 我试过dill,但我无法让它为动态创建的类工作,尽管我知道你在其他地方说过这是可能的。我认为拥有这些复杂的对象可能不是最好的。
  • dill 通常应该适用于动态生成的类,因此,如果您发现它不适用的情况,请提出 SO 问题或将其发布在 dill github 问题上。跨度>
  • 您上面的所有例外都说it's not found as __builtin__.function,但原始问题的例外说attribute lookup __builtin__.function failed...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多