Python 3.9 已于2020 年 10 月 5 日发布,新版本的特性,你 get 到了吗?对于 Python 程序员来说,这又是一个令人兴奋的时刻。
相比于之前的版本,Python 3.9 有哪些值得讨论的功能呢?
简而言之,从字典更新 / 合并到添加新的字符串方法,再到 zoneinfo
库的引入,Python 3.9 添加了许多新特性。此外,该版本还引入了一种稳定、高性能的新型解析器。
标准库更新了许多新特性,并添加了新模块 zoneinfo
和 graphlib
。此外该版本也对许多模块进行了改进,如 ast
、asyncio
、concurrent.futures
、multiprocessing
、xml
等。
现在让我们一起探索 Python 3.9 的新特性。
合并 (|
) 与更新 (|=
) 运算符已被加入内置的 dict
类。 它们为现有的 dict.update
和 {**d1, **d2}
字典合并方法提供了补充。
示例:
>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}
>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>> y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}
Python 3.9 提出用高性能和稳定的基于 PEG 的解析器取代当前基于 LL(1) 的 Python 解析器。
当前的 CPython 解析器基于 LL(1),LL(1) 解析器是一个自顶向下的解析器,它从左到右解析输入。
Python 3.9 提议将 LL(1) 替换为新的基于 PEG 的解析器,这意味着它将解除当前 LL(1) 语法对 Python 的限制。此外,当前的解析器修补了许多将要删除的 hack。因此,从长远来看,这会降低维护成本。
Python 3.9 将两个新函数添加到 str 对象:
第一个函数用于删除前缀:str.removeprefix(prefix)
第二个函数用于删除后缀:str.removesuffix(suffix)
Python 3.9 通过删除并行类型层次结构,使注释程序变得更加简单。Python 3.9 支持 typing
模块所有标准集合中的泛型语法。
我们可以将 list
或 dict
直接作为列表和字典的类型注释,而不必依赖 typing.List
或者 typing.Dict
。因此,代码现在看起来更加简洁,而且更容易理解和解释。
zoneinfo
模块被创建出来支持 IANA 时区数据库。对 IANA 时区数据库的支持已经添加到标准库中。
示例:
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Daylight saving time
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'
>>> # Standard time
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST
IANA 时区通常称为 tz
或 zone info
。存在许多具备不同搜索路径的 IANA 时区,用于为 datetime
对象指定 IANA 时区。例如,我们可以将对
对象设置搜索路径datetime
Continent/City
来设置tzinfo
。
如果传入一个无效的密钥,则会引发zoneinfo.ZoneInfoNotFoundError
异常。
concurrent.futures.Executor.shutdown()
中添加了一个新参数cancel_futures
。此参数可以取消尚未执行的并发任务。在 Python 3.9 之前主进程只有在所有并发任务完成后才能关闭 executor
对象。
新参数 cancel_futures
已被添加到 ThreadPoolExecutor
以及 ProcessPoolExecutor
。它的工作方式是:当参数的值为 True
时,在调用 shutdown()
函数时取消所有待处理的任务。
Python 3.9 对异步编程(asyncio
)和多进程库进行了优化。
2. 新增了 coroutines
、shutdown_default_executor()
和 asyncio.to_thread()
。shutdown_default_executor
负责关闭默认 executor
,asyncio.to_thread()
主要用于在一条单独的线程中运行 IO 密集型函数,以避免事件循环。
关于多进程库的改进,Python 3.9 向 multiprocessing.SimpleQueue
类添加了新方法 close()
。
此方法可以显式地关闭队列。这将确保队列关闭并且停留时间不会比预期长。值得注意的是,一旦关闭队列,就不能调用get()
、put()
和 empty()
方法。
Python3.9 之前的版本在导入 Python 库时存在的主要问题是:当相对导入超出其顶级包时,Python 中的导入行为不一致。
builtins.__import__()
引发 ValueError
,而 importlib.__import__()
引发 ImportError
。Python3.9 版本进行了修复,它将统一引发 ImportError
。
Python 3.9 版本中添加了新的函数random.Random.randbytes()
。该函数可用于生成随机字节。
Python 支持生成随机数,但如果需要生成随机字节呢?在 Python3.9 版本之前,开发人员必须想方设法生成随机字节。尽管他们可以使用os.getrandom()
、os.urandom()
或者 secrets.token_bytes()
来生成随机字节,但这些方法无法生成伪随机模式。
为了确保随机数的产生符合预期行为,并且过程可复现,开发人员通常将种子(seed)与 random.Random
模块一起使用。因此,Python 3.9 添加了 random.Random.randbytes()
方法,以可控的方式生成随机字节。
在 Python 3.9 版本之前,对于所有非零的 n,"".replace("",s,n) 返回空字符串而不是 s。这个错误使用户困惑,并导致应用程序的不一致行为。
Python 3.9 修复了该问题,不管 n 是否为 0,其结果都与 "".replace("", s) 一致。
如果大家想深入了解更多细节,请查阅官方文档:https://docs.python.org/zh-cn/3.9/whatsnew/3.9.html