我很惊讶地发现python(版本3.2.2)拒绝挑选一个对象,因为它的dict包含一个引用Ellipsis.其他的内置常量,泡菜是乐意与合作False,True以及None作为中明确规定泡菜的文档,也扼流圈NotImplemented.
Python 3.2.2 (default, Sep 5 2011, 21:17:14)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pickle
>>> pickle.dumps(True)
b'\x80\x03\x88.'
>>> pickle.dumps(False)
b'\x80\x03\x89.'
>>> pickle.dumps(None)
b'\x80\x03N.'
>>> pickle.dumps(Ellipsis)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
_pickle.PicklingError: Can't pickle <class 'ellipsis'>: attribute lookup builtins.ellipsis failed
>>> pickle.dumps(NotImplemented)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
_pickle.PicklingError: Can't pickle <class 'NotImplementedType'>: attribute lookup builtins.NotImplementedType failed
Run Code Online (Sandbox Code Playgroud)
为了完整性,不太有用的内置常量,__debug__只是一个bool,所以没有问题; copyright,license和credits工作(他们的类型是site._Printer); quit并且exit不要(它们的类型是site.Quitter,因为它在函数内定义而无法找到).
任何人都可以解释为什么这是 - 当然Ellipsis,NotImplemented并没有被忽视?我能找到的唯一相关信息是这个错误,它抱怨NoneType(即type(None))不可挑选.其中一位评论者提到type(Ellipsis)并且type(NotImplemented)不能被腌制,显然没有注意到他们的实例也不可能.
绝对没有理由不让python腌制像Ellipsis和这样的东西NotImplemented,并且坦率地说,不让它们腌制会加剧python作为并行/异步语言的脆弱性。您可以用dill代替这些来腌制这些类型的对象pickle。是的,我知道这很温和,但是我认为NotImplemented您的目标代码中的a不应阻止您使用multiprocessing并行python或从其上进行其他操作……或保存python会话的状态以供以后使用……或随你。
Python 3.2.5 (default, May 19 2013, 14:25:55)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> dill.dumps(True)
b'\x80\x03\x88.'
>>> dill.dumps(False)
b'\x80\x03\x89.'
>>> dill.dumps(None)
b'\x80\x03N.'
>>> dill.dumps(Ellipsis)
b'\x80\x03cdill.dill\n_eval_repr\nq\x00X\x08\x00\x00\x00Ellipsisq\x01\x85q\x02Rq\x03.'
>>> dill.dumps(NotImplemented)
b'\x80\x03cdill.dill\n_eval_repr\nq\x00X\x0e\x00\x00\x00NotImplementedq\x01\x85q\x02Rq\x03.'
Run Code Online (Sandbox Code Playgroud)
到达dill这里:https : //github.com/uqfoundation/dill
引用文档:
可以腌制以下类型:
- 无、真、假
- 整数、浮点数、复数
- 字符串、字节、字节数组
- 仅包含可腌制对象的元组、列表、集合和字典
- 定义在模块顶层的函数
- 在模块顶层定义的内置函数
- 在模块顶层定义的类
- 此类类的实例,其 __dict__ 或 __setstate__() 是可picklable的(有关详细信息,请参阅 Pickling 类实例部分)
有问题的两个对象Ellipsis和NotImplemented不符合任何这些规则,因此无法进行 pickle。
我怀疑除了没有人认为有必要之外,还有什么更好的理由不在第一条规则中包含所有内置常量。如果您确实认为 pickle 应该支持这一点,请考虑发布功能请求(最好带一个令人信服的用例!)。
| 归档时间: |
|
| 查看次数: |
1098 次 |
| 最近记录: |