3

Python 3.8 即将到来,这是你需要关注的几大新特性

 3 years ago
source link: https://www.jiqizhixin.com/articles/2019-07-18-4
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
2019/07/18 14:08
一鸣 路整理

Python 3.8 即将到来,这是你需要关注的几大新特性

Python 是一门广受好评的编程语言,每个版本的更新都会对开发社区带来一定影响。近日,Python 3.8 已进入 beta 2 版本的测试中,各项新特性已经添加完毕,最终版本预计于今年 10 月发布。在发布即将到来前,机器之心总结了 Python 3.8 中几大值得关注的新功能和改进。

从事计算机领域工作的读者朋友对 Python 编程语言应该非常熟悉了。这是一门广受好评的动态编程语言,其灵活和语法简易的特点使得这门语言在脚本工具、数据分析、Web 后端都有广泛的应用。Python 开发社区也非常活跃,3.x 的版本迭代速度非常快。2018 年 6 月底,Python 3.7 问世,之后 Python 3.8 的开发和测试工作也已经展开。近日,Python 软件基金会公开了 3.80b2 的说明文档,向公众展示了 beta 版本的测试进展,以及 Python 3.8 版本的新特性和功能改进。

目前,Python 3.8 的 beta 测试流程正在进行中。今年 6 月初,官方发布了第一个 beta 版本——Python 3.80b1,紧接着一个月后发布了 Python 3.80b2。第二个 beta 版本发布后,Python 3.8 新特性已经添加完毕。官方目前已公布最终版本的发布时间,预计在今年的 10 月份。

那么,新的 Python 3.8 版本有哪些新特性和功能呢?机器之心根据 Python 基金会公开的文档,整理出了以下值得期待的新特性和功能改进。

文档地址:https://docs.python.org/zh-cn/3.8/whatsnew/3.8.html#summary-release-highlights

新的语法

Python 3.8 中最值得关注的部分在于其语法的变化,这些新语法有助于提升效率,减少代码工作量。

海象运算符( := )

这个「:=」横过来看是不是有点像海象的脸?这是一个新的 Python 语法,可以在进行条件判断时直接为变量赋值。

过去我们需要首先对某个变量进行赋值,然后进行条件判断。

m = re.match(p1, line)if m:    return m.group(1)else:    m = re.match(p2, line)if m:    return m.group(2)else:    m = re.match(p3, line)    ...

而使用海象运算符后,我们可以直接为变量赋值:

if m := re.match(p1, line):    return m.group(1)elif m := re.match(p2, line):    return m.group(2)elif m := re.match(p3, line):

还有一个在循环中使用的例子,过去在对某个变量进行循环前必须首先赋值:

ent = obj.next_entry()while ent:    ... # process ent    ent = obj.next_entry()

现在可以一边循环一边赋值:

while ent := obj.next_entry():    ... # process ent

代码调试中支持 f-string

f-string(或者称为「格式化字符串」)在 Python 3.6 版本中加入的,虽然这一特性非常方便,但是开发者发现 f-string 对调试没有帮助。因此,Eric V. Smith 为 f-string 添加了一些语法结构,使其能够用于调试。

在过去,f-string 可以这样使用:

print(f'foo={foo} bar={bar}')

在 Python 3.8 中,只需使用如下代码(更加简洁):

print(f'{foo=} {bar=}')

两种情况下,输出都是:

>>> foo = 42>>> bar = 'answer ...'>>> print(f'{foo=} {bar=}')    foo=42 bar=answer ...

此外,可以通过在赋值符号后增加「!s」和「!f」命令,规定输出结果的格式,例如:

>>> import datetime>>> now = datetime.datetime.now()>>> print(f'{now=} {now=!s}')   now=datetime.datetime(2019, 7, 16, 16, 58, 0, 680222) now=2019-07-16 16:58:00.680222
>>> import math>>> print(f'{math.pi=!f:.2f}')    math.pi=3.14

如代码所示,第二个「now」变量的等号后增加了「!s」字符,使得 now 从「datetime」类型的输出变成了字符串类型的输出。在「pi」的输出中,由于加入了「!f:.2f」,使得 pi 的输出变为了保留小数点后两位。

而花括号中的格式也会影响打印结果的格式,例如:

>>> a = 37>>> print(f'{a = }, {a = }')    a = 37, a = 37

花括号中的等号前后间距不同,打印结果中的间距也不一样。

不需要 Keyword 的变量输入

这一语法使得函数在定义输入变量时可以规定只能输入 Value,而不在 Value 前加上 Keyword。

例如,在使用 pow() 函数时:

>>> pow(2, 3)    8>>> pow(x=2, y=3)    ...    TypeError: pow() takes no keyword arguments

第一种方法是合法的,但是第二种则非法。

为了保证第一种纯粹的 Python 函数方法,开发者可以在定义函数时使用「/」规定哪些变量的输入必须按照第一种格式。例如:

def pow(x, y, z=None, /):    r = x**y    if z is not None:       r %= z       return r

在定义了所有变量之后额外增加一个「/」字符,表示所有的 Python 变量输入必须按照 pow(x, y, z) 的方式进行。

当然,也可以在变量之间插入「/」,正斜杠之前的变量按照纯粹的 Python 输入方法,而正斜杠之后的按照定义好的方法执行。例如,定义如下函数:

def fun(a, b, /, c, d, *, e, f):    ...

则以下一些表达式合法的,但另一些非法:

fun(1, 2, 3, 4, e=5, f=6) # legalfun(1, 2, 3, d=4, e=5, f=6) # legalfun(a=1, b=2, c=3, d=4, e=5, f=6) # illegal

其他特性

除了一些语法方面的改进,Python 3.8 版本还有一些其他的变化。

可移动的「__pycache__」

 __pycache__目录是由 Python3 解释器创建的,用于保存.pyc 文件。这些文件保存着解释器编译.py 文件之后的字节码(byte code)。之前的 Python 版本仅仅只是为每个.py 文件创建一个.pyc 文件,但是新版本会有所变化。

为了支持多版本的 Python,包括一些不是 CPython 的版本(如 PyPy),现在库文件会为每个 Python 版本创建对应的.pyc 文件,格式形如「name.interp-version.pyc」。例如,某个 foo.py 文件在第一次使用的时候会创建一个对应的 pyc 文件,其路径为「__pycache__/foo.cpython-37.pyc」,这个 pyc 文件会定义使用的 Python 版本。

其他改进

Python 3.8 会为 C 语言扩展加入更快的调用方式,这种方式原本属于 CPython。在 Python3.8 中,这一功能是实验性的,最终的完成版本会出现在 Python3.9 中。

同时,编译器中的初始化配置处理也得到了清理,使得 Python 可以更好地嵌入其他程序,不需要依赖环境变量或在已有的 Python 系统中增加导致冲突的其他组件。

此外,大量的 Python 自带模块得到了改进和调整,如「os.path」、「shutil」、「math」、「ssl」等。

Python 3.8 什么时候与大家见面?

目前发布时间仍在探讨,但考虑到 Python 3.9 的发布计划(大约在 2020 年 6 月),官方认为 Python3.8 的发布时间不应当晚于今年 10 月份。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK