Python3.7升级Python3.8(Python3.8新特性调研)
简介:
Python3.7升级Python3.8(Python3.8新特性调研)
参考链接:
- Python官方文档:Python3.8有什么新变化
- Python官方文档:移植到Python3.8
Python 行为的改变:
- yield 表达式(包括 yield 和 yield from 子句)现在不允许在推导式和生成器表达式中使用(但 for 子句最左边的可迭代对象表达式除外)。
- Python推导式:一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。如:[out_exp_res for out_exp in input_list]
- Python生成器表达式:生成器表达式是用圆括号来创建生成器,其语法与推导式相同,只是将 [] 换成了 () ,生成器表达式会产生一个新的生成器对象。如:(out_exp_res for out_exp in input_list)
- 当标识号检测 (is 和 is not) 与特定类型的字面值 (例如字符串和数字) 一同使用时编译器现在会产生 SyntaxWarning。
- 从类型字典获取属性时引发的异常不会再被忽略。
- 从内置类型 bool, int, float, complex 和标准库的一些类中移除了 str 实现。 它们现在会从 object 继承 str()。 作为结果,在这些类的子类中定义 repr() 方法将会影响它们的字符串表示。
Python API的改变:
- 在 Windows 上 os.getcwdb() 函数现在会使用 UTF-8 编码格式而不是 ANSI 代码。
- 现在 subprocess.Popen 在某些情况下会使用 os.posix_spawn() 以获得更好的性能。 在适用于 Linux 的 Windows 子系统和 QEMU 用户模拟器上,使用 os.posix_spawn() 的 Popen 构造器不会再因为“找不到程序”这样的错误引发异常。 而是让子进程失败并返回一个非零的 returncode。
- imap.IMAP4.logout() 方法不会再静默地忽略任意异常。
- 当传入多模数据时 statistics.mode() 函数不会再引发异常。 它将改为返回在输入数据中遇到的第一个模式。
- xml.dom.minidom 的 writexml(), toxml() 和 toprettyxml() 方法以及 xml.etree 的 write() 方法现在会保留用户指定的属性顺序。
- 附带 'r' 旗标打开的 dbm.dumb 数据库现在将是只读的。 如果数据库不存在,附带 'r' 和 'w' 旗标的 dbm.dumb.open() 不会再创建数据库。
- 在 XMLParser 的子类中定义的 doctype() 方法将不会再被调用,并将导致发出 RuntimeWarning 而不是 DeprecationWarning。 请在目标上定义 doctype() 方法来处理 XML doctype 声明。
- 现在当自定义元类未在传给 type.new 的命名空间中提供 classcell 入口时将引发 RuntimeError。 在 Python 3.6--3.7 中是则是引发 DeprecationWarning。
- shutil.copyfile(), shutil.copy(), shutil.copy2(), shutil.copytree() 和 shutil.move() 会使用平台专属的 "fast-copy" 系统调用。
- PyGC_Head 结构已被完全改变。 所有接触到该结构的代码都应当被重写。
- 现在所有平台下的 mmap.flush() 方法都会在成功时返回 None 并在错误时引发异常。 之前它的行为取决于具体平台: Windows 下会在成功时返回非零值;在失败时返回零。 Unix 下会在成功时返回零;在失败时引发错误。
- xml.dom.minidom 和 xml.sax 模块默认将不再处理外部实体。
- 从只读的 dbm 数据库 (dbm.dumb, dbm.gnu 或 dbm.ndbm) 删除键将会引发 error (dbm.dumb.error, dbm.gnu.error 或 dbm.ndbm.error) 而不是 KeyError。
- 简化了字面值的 AST。 所有常量将被表示为 ast.Constant 的实例。 实例化旧类 Num, Str, Bytes, NameConstant 和 Ellipsis 都将返回 Constant 的实例。
- 异常 asyncio.CancelledError 现在继承自 BaseException 而不是 Exception 并且不再继承自 concurrent.futures.CancelledError。
- 当使用 asyncio.Task 的实例时,函数 asyncio.wait_for() 现在会正确地等待撤销。 在此之前当达到 timeout 时,它会被撤销并立即返回。
- 当将 'socket' 作为 name 形参传入时,函数 asyncio.BaseTransport.get_extra_info() 现在会返回一个可安全使用的套接字对象。
- 关联到 pgen 的头文件和函数在其被纯 Python 实现取代后已被移除。
- types.CodeType 在构造器的第二个位置新增了一个形参 (posonlyargcount) 以支持在 PEP 570 中定义的仅限位置参数。 第一个参数 (argcount) 现在表示位置参数的总数量 (包括仅限位置参数)。 types.CodeType 中新增的 replace() 方法可用于让代码支持 future 特性。