Python 3.8

Python 3.8.0(最终版本)于2019年10月14日发布。3.8的特性在 PEP 569 中定义,有关更改的详细描述可以在 What’s New in Python 3.8. 中找到

特性

状态

PEP 570

Positional-only 参数

PEP 572

赋值表达式

完成

PEP 574

带外数据的Pickle协议5

PEP 578

运行时审计挂钩

PEP 587

Python初始化配置

PEP 590

Vectorcall: CPython的快速调用协议

混杂的

f字符串支持=用于自文档化表达式和调试

完成

其他语言变化:

一条 continue 语句在 finally 子句中是非法的,因为实现上存在问题。在 Python 3.8 中,这一限制被取消了

完成

boolintfractions.Fraction 类型现在有一个 as_integer_ratio() 方法,就像* float* 和 decimal.Decimal 中的那个方法一样

intfloat 和* complex* 的构造函数现在会使用 __index__() 特殊方法,如果该方法可用且对应的 __index__()__float__()*__complex__()*方法不可用

在正则表达式中添加了对 N{name} 转义序列的支持

字典和字典视图现在可以使用 reversed() 按插入顺序的反向顺序进行迭代

函数调用中允许的关键字名称的语法进一步被限制。特别是,f((keyword)=arg) 这种写法不再被允许

在 yield 和 return 语句中,通用的可迭代 unpacking 不再需要括号

当代码中遗漏逗号,如 [(10, 20) (30, 40)] 时,编译器会显示一个 SyntaxWarning,并提供有用的建议

datetime.date*datetime.datetime *的子类与 *datetime.timedelta *对象之间的算术运算现在会返回子类的实例,而不是基类的实例

当 Python 解释器被 Ctrl-C (SIGINT) *中断,并且生成的 *KeyboardInterrupt 异常没有被捕获时,Python 进程现在会通过 SIGINT 信号退出或使用正确的退出代码,以便调用进程可以检测到它因 Ctrl-C 而终止

一些高级编程风格需要更新现有函数的 types.CodeType 对象

对于整数,pow() 函数的三参数形式现在允许在基数与模数互质的情况下,指数为负数

字典推导式现在与字典字面量同步,使得键首先被计算,然后是值

*object.__reduce__()*方法现在可以返回两个到六个元素长的元组

对内置模块的更改:

asyncio

*asyncio.run()*已从临时API升级为稳定API

完成

运行*python -m asyncio*会启动一个本地异步REPL

异常*asyncio.CancelledError*现在继承自*BaseException*而不是*Exception*,并且不再继承自*concurrent.futures.CancelledError*

完成

增加了*asyncio.Task.get_coro()*方法,用于获取 *asyncio.Task*内部封装的协程

现在可以通过将name关键字参数传递给*asyncio.create_task()*或*create_task()* 事件循环方法,或通过调用任务对象上的 *set_name()*方法来命名Asyncio任务

asyncio.loop.create_connection()*增加了对Happy Eyeballs的支持。为了指定行为,添加了两个新参数: *happy_eyeballs_delay 和interleave。

gc

get_objects() 现在可以接收一个可选的 generation 参数,该参数指示从哪一代获取对象。(请注意,虽然*gc*是内置的,但 get_objects() 并没有为MicroPython实现)

math

添加了新的函数*math.dist()* 用于计算两点之间的欧几里德距离

扩展了 *math.hypot()*函数以处理多个维度

添加了新函数,math.prod(),作为类似于 sum() 的函数,返回 “start” 值(默认值:1)乘以数字可迭代对象的乘积

添加了两个新的组合函数*math.perm()*和*math.comb()*

增加了一个新的函数 math.isqrt() ,用于计算精确的整数平方根而不转换为浮点数

函数 math.factorial() 不再接受非int型的参数

完成

sys

添加新的*sys.unraisablehook()* 函数,该函数可以被重写以控制如何处理”不可引发的异常”