首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不能对Ellipsis和NotImplemented进行酸洗?

为什么不能对Ellipsis和NotImplemented进行酸洗?
EN

Stack Overflow用户
提问于 2012-01-23 22:34:31
回答 2查看 1.2K关注 0票数 12

我很惊讶地发现python (版本3.2.2)拒绝pickle对象,因为它的dict包含对Ellipsis的引用。在其他built-in constants中,pickle很乐意使用FalseTrueNone,正如pickle documentation中明确说明的那样,但也会在NotImplemented上卡住。

代码语言:javascript
复制
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

就完整性而言,在不太有用的内置常量中,__debug__只是一个布尔值,所以不会造成问题;copyrightlicensecredits可以工作(它们的类型是site._Printer);quitexit不能(它们的类型是site.Quitter,因为它是在函数中定义的,所以找不到它)。

有没有人能解释一下为什么-- EllipsisNotImplemented肯定没有被忽视?我能找到的唯一相关信息是this bug,它抱怨NoneType (即type(None))不可拾取。其中一位评论者提到,type(Ellipsis)type(NotImplemented)不能被酸洗,显然没有注意到它们的实例也不能。

EN

回答 2

Stack Overflow用户

发布于 2014-03-22 23:02:19

python绝对没有理由不保留像EllipsisNotImplemented这样的东西,坦率地说,不让它们可提取是python作为一种并行/异步语言的脆弱性所在。您可以使用dill ( pickle的替代品)来筛选这些类型的对象。是的,我知道这是一个温和的抱怨,但我认为目标代码中的NotImplemented不应该阻止您使用multiprocessing或其他形式的并行python…或者保存您的python会话的状态以供以后使用…或者别的什么。

代码语言:javascript
复制
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.'

在这里获取dillhttps://github.com/uqfoundation/dill

票数 5
EN

Stack Overflow用户

发布于 2012-01-23 23:05:22

引用documentation

可以对以下类型进行酸洗:

  • None、True和False
  • integers,浮点数、复杂的numbers
  • strings,字节、bytearrays
  • tuples,列表、sets以及仅包含在module
  • classes顶层定义的module
  • instances函数顶层定义的可挑取的字典
    • None、True和dictionaries这些类的__dict__或__setstate__()是可挑取的(有关详细信息,请参见picklable类实例一节)

有问题的两个对象EllipsisNotImplemented不符合这些规则中的任何一个,因此不能进行酸洗。

我怀疑在第一个规则中没有包含所有内置常量的更好的理由,除了没有人看到它的必要性。如果你真的认为pickle应该支持这一点,考虑发布一个特性请求(最好提供一个令人信服的用例!)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8973238

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档