Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python3.7中的泡菜破坏更改

Python3.7中的泡菜破坏更改
EN

Stack Overflow用户
提问于 2018-09-14 06:17:52
回答 1查看 3.5K关注 0票数 8

我有自定义list和字典类,在Python3.7中,这些类不再起作用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pickle

class A(dict):
    pass

class MyList(list): 

    def __init__(self, iterable=None, option=A):
        self.option=option
        if iterable:
            for x in iterable:
                self.append(x)

    def append(self, obj):
        if isinstance(obj, dict):
            obj = self.option(obj)
        super(MyList, self).append(obj)

    def extend(self, iterable): 
        for item in iterable:
            self.append(item)


if __name__ == '__main__':
    pickle_file = 'test_pickle'
    my_list = MyList([{'a': 1}])
    pickle.dump(my_list, open(pickle_file, 'wb'))
    loaded = pickle.load(open(pickle_file, 'rb'))
    print(isinstance(loaded[0], A))

Python2.6到3.6运行良好:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"C:\Program Files\Python36\python.exe" issue.py
True

但不再正确地将self.option设置为3.7。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"C:\Program Files\Python37\python.exe" issue.py

Traceback (most recent call last):
  File "issue.py", line 28, in <module>
    loaded = pickle.load(open(pickle_file, 'rb'))
  File "issue.py", line 21, in extend
    self.append(item)
  File "issue.py", line 16, in append
    obj = self.option(obj)
AttributeError: 'MyList' object has no attribute 'option'

但是,如果我要删除extend函数,它就会像预期的那样工作。

我也尝试过添加__setstate__,但是在extend之前没有调用它,因此option在那时仍然没有定义。

我确实必须直接从dictlist继承,我确实需要在代码中覆盖appendextend函数。是否有一种预先设置option或另一种修复的方法?这种行为的改变是否记录在案,是否合理?

谢谢您抽时间见我

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-14 07:15:21

取消列表对象list.extend(),因为对于某些list子类来说,这样做要快得多。

但是,随着这一变化,列表对象的未筛选代码测试的方式也发生了变化,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (PyList_Check(list)) {

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (PyList_CheckExact(list)) {

正是这种改变影响了您的代码。上面的测试寻找一个快速路径,也就是说,如果我们有一个list类,那么使用PyList_SetSlice()加载数据,而不是显式调用新实例上的.extend().append()方法的较慢路径。旧版本(Python3.6及更高版本)接受列表和子类,新版本只接受list本身,而不是子类!

因此,对于Python3.6和更高版本,在解压缩自定义MyList.append() 方法时,并不称为,这完全是因为您对list进行了子类化。在Python3.7中,当取消自定义MyList.extend()方法时,调用是。这在很大程度上是有意的,应该允许子类提供一个自定义的.extend()方法,该方法在不进行腌制时会被调用。

解决问题很简单。您的数据已经包装好了,您不需要重新应用该包装器。当您没有self.option集时,只需跳过应用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def append(self, obj):
    if isinstance(obj, dict):
        try:
            obj = self.option(obj)
        except AttributeError:
            # something's wrong, are we unpickling on Python 3.7 or newer?
            if 'option' in self.__dict__:
                # no, we are not, because 'option' has been set, this must
                # be an error in the option() call, so re-raise
                raise
            # yes, we are, just ignore this, obj is already wrapped
    super(MyList, self).append(obj)

这一切都意味着您不能依赖任何已经恢复的实例属性。如果这是一个很大的问题(您仍然需要在解析过程中查询实例状态),那么您必须提供一个不同的 method,它不会将数据作为迭代器返回到结果元组的索引3中。协议版本2、3和4的list().__reduce_ex__()返回(copyreg.__newobj__, type(self), self.__dict__, iter(self), None)

例如,定制版本必须使用(type(self), (tuple(self), self.option), None, None, None)。这确实带来了一些额外的开销(当tuple(self)进行腌制和不腌制时,它将占用额外的内存)。

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

https://stackoverflow.com/questions/52333864

复制
相关文章
[Nginx] 1.17.9中的更改日志
5.更改使用“ error_page”指令重定向了494时,把状态码400换成494
唯一Chat
2020/04/14
3K0
Windows中安装Python3.7 原
根据自己的需求进行下载,这里本人下载的是:python-3.7.0-amd64.exe
云飞扬
2019/03/13
8791
Windows中安装Python3.7
                                                                            原
Visual C++ 中的重大更改
https://technet.microsoft.com/zh-cn/learning/bb531344.aspx
用户7886150
2021/02/11
5.3K0
Visual C++ 中的重大更改
https://technet.microsoft.com/zh-cn/learning/bb531344.aspx
用户7886150
2021/02/13
4.8K0
Dygraph 中 Range Selector 的监听更改
之前文章 Dygraph 结合 Angular 实现多图表同步 中,在文末我们留了一个疑问,更多的操作解锁? 这里我们添加 Range Selector 并进行同步~ 添加 Range Selecto
Jimmy_is_jimmy
2023/07/09
1940
Dygraph 中 Range Selector 的监听更改
在CentOS7中安装python3.7
下载python3.7.0的安装包至/usr/local/src/目录,切换至/usr/local/src/目录:
py3study
2020/01/10
9780
Python3.7中文官方文档来袭...
对于很多新手而言,面对下面这样的文档会无从下手,表示被拒在大门外,而陷入迷茫、 But,作为新手的你,有福了,官方中文版来袭了。。。 是这样的。。。。 来来来 ,先看下Python3.7有哪些新变化
苦叶子
2019/05/06
6.4K0
Python3.7中文官方文档来袭...
python3.7 的新特性
Python 3.7增添了众多新的类,可用于数据处理、针对脚本编译和垃圾收集的优化以及更快的异步I/O。
py3study
2020/01/13
1.9K0
Python3.7中一种懒加载的方式
Python3.7在模块上也添加了__getattr__()和__dir__()两个方法。这个新特性让我们能够实现一些有趣的事情。例如,通过定义__dir__方法,你可以要求dir(模块)只显示__all__中定义的内容了。
IT派
2018/07/30
1.5K0
Python3.7中一种懒加载的方式
Python3.7中文字符编码问题
最近在尝试 Python Web方面的开发尝试,框架使用的是Django,但是在读取数据库并页面展示的时候,出现了中文编码的问题。
小柒2012
2019/12/05
1.7K0
Kubernetes 1.25 中的重大更改和删除
随着 Kubernetes 的发展和成熟,有些功能可能会被弃用、删除或替换。Kubernetes v1.25 包括几项重大更改和删除。
我的小碗汤
2023/03/19
1.9K0
Kubernetes 1.25 中的重大更改和删除
SAP中 更改物料的计价方式 CKMM
声明:本文系网络资源仅代表原作者观点,仅用于SAP软件的应用与学习,不代表SAP公司。注:文中所示截图来源SAP软件,相应著作权归SAP所有。文中所指ERP即SAP软件。
齐天大圣
2021/04/08
4.7K0
SAP中 更改物料的计价方式 CKMM
python3.7 错误: Modul
在使用python是经常会用到import一个第三方库,但是有时候会提示某个模块不存在,如Crypto 其实是因为Python3里面这个模块的名字变了,
py3study
2020/01/06
1.4K0
Linux安装Python3.7
https://www.python.org/downloads/release/python-370/
py3study
2020/01/06
2K0
Linux安装Python3.7
Python3.7安装pyspider
pyspider是国人binux编写的强大的网络爬虫框架,它带有强大的WebUI、脚本编辑器、任务监控器、项目管理器以及结果处理器,同时支持多种数据库后端、多种消息队列,另外还支持JavaScript渲染页面的爬取,使用起来非常方便。
不可言诉的深渊
2019/07/26
1.2K0
Python3.7的进化-异步编程
asyncio相关模块已经成为Python很核心的一部分,aio-libs一直在持续的发展中,例如aiohttp、aiopg等库已经可以初步的在生产环境使用了。在Python3.7中,引入了一系列的与asyncio相关变化,这些变化聚焦在代码质量,让开发者尽量地减少工作量和获得更好的性能体验,主要内容包括了<新的保留字>、<环境变量>、<新的asyncio.run()函数>、<更简单的任务管理、时间循环管理>、<回调更新>、<异步的上下文管理器>等。
哒呵呵
2019/01/23
2.7K0
Python中的chdir函数:更改工作目录利器
在Python中,`chdir`是一个内置函数,用于更改当前工作目录。今天就给大家简单介绍一下该函数的用法和一些注意事项,一起来学习一下吧。
华科云商小彭
2023/10/07
2540
Python中的chdir函数:更改工作目录利器
Python3.7 contextvars 初探
Python 3.7 于2018年6月27日发布,本篇文章将对其中新增模块contextvars 做初步介绍,为读者勾勒一个大概轮廓。
Python中文社区
2018/10/25
1.6K0
Python3.7安装mysqlclient
MysqlClient 是 Python 操作 MySql 的一个驱动程序,是 MySQL-python 的另外一个分支,目前MySQL-python 只支持到Python2,而 MysqlClient 支持 Python3 并且修复了一些bug。
小柒2012
2019/12/09
1.4K0
点击加载更多

相似问题

jax中的泡菜更改类型

113

更改保存的泡菜的导入库

11

更改Python3.7中时间戳的格式

10

在Python3.7中更改NIFTI的整个图像切片

10

删除泡菜中的数据

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文