Python 3.9.0稳定版

Python 3.9.0稳定版本预计将在2020年10月5日发布。新版本大约每2个月将收到补丁更新,大约持续18个月。最终版本3.10.0发布后的某个时间,第九个和最后一个更新将与错误修复程序3.9一起发布。



“这是Python在Windows上默认为64位安装程序的第一个版本。现在,安装程序还积极禁止在Windows 7上进行安装。”

“这是默认情况下在Windows上使用64位安装程序的Python的第一个版本。现在,安装程序还会阻止在Windows 7上安装。”



我已经阅读了Python 3.9发行说明和相关讨论。根据这些信息,我想写一个全面的指南,以便每个人都能对功能及其详细工作有所了解。



UPD

过渡到稳定的年度发布周期,请参阅PEP 602

alec_kalinin

“每个新版本的Python现在都将在十月份问世。Python 3.10将于2021年10月发布,Python 3.11将于2022年10月发布。Buckfix将每两个月发布一次。这对我来说是个好消息,现在我们可以明确计划升级python环境了。”



PEP 584



该PEP建议将合并(|)和更新(| =运算符添加到内置dict类中。



要合并:|



>>> a = {'milk': 'prostokvashino', 'heese': 'cheddar'} 
>>> b = {'milk': 1, 'heese': 2, 'bread': 3} 
>> >  | b 
{'milk': 1, 'heese': 2, 'bread': 3}
>>> b | a 
{'milk': 'prostokvashino', 'heese': 'cheddar', 'bread': 3}


更新:| =



>>> a | = b 
>>> a 
{'milk': 1, 'heese': 2, 'bread': 3}


要记住的关键规则是,如果存在任何关键冲突,那么将保留最右边的值。



当然,许多python专家会提出一个问题,如果每个人都已经熟悉了一个选项,为什么这是必要的



{**d1, **d2}


PEP本身回答了这个问题:



打开字典包装看起来很丑,而且不容易发现。很少有人能够在第一次看到它时就猜出这是什么意思。


正如Guido所说

我对PEP 448感到抱歉,但是即使您在更简单的上下文中了解** d,如果您问一个典型的Python用户如何将两个字典合并为一个新字典,我怀疑很多人会想到{** d1,** d2}。我知道我自己在此线程启动时忘记了它!


另外{** d1,** d2}不适用于像defaultdict这样的dict子类




PEP 585



标准集合中的泛型类型提示。



泛型是一种可以参数化的类型,是一种容器。也称为参数类型或通用类型。



此版本包括对“打字”模块中当前可用的所有标准集合的通用语法支持。我们可以使用listdict类型作为泛型类型,而不是使用type.Listtype.Dict



它是:



from typing import List

a: List[str] = list()

def read_files(files: List[str]) -> None:
    pass


成为:



a: list[str] = list()

def read_files(files: list[str]) -> None:
    pass


类型的完整列表
tuple

list

dict

set

frozenset

type

collections.deque

collections.defaultdict

collections.OrderedDict

collections.Counter

collections.ChainMap

collections.abc.Awaitable

collections.abc.Coroutine

collections.abc.AsyncIterable

collections.abc.AsyncIterator

collections.abc.AsyncGenerator

collections.abc.Iterable

collections.abc.Iterator

collections.abc.Generator

collections.abc.Reversible

collections.abc.Container

collections.abc.Collection

collections.abc.Callable

collections.abc.Set # typing.AbstractSet

collections.abc.MutableSet

collections.abc.Mapping

collections.abc.MutableMapping

collections.abc.Sequence

collections.abc.MutableSequence

collections.abc.ByteString

collections.abc.MappingView

collections.abc.KeysView

collections.abc.ItemsView

collections.abc.ValuesView

contextlib.AbstractContextManager # typing.ContextManager

contextlib.AbstractAsyncContextManager # typing.AsyncContextManager

re.Pattern # typing.Pattern, typing.re.Pattern

re.Match # typing.Match, typing.re.Match



PEP 615



标准库中的IANA时区数据库支持。



IANA时区通常称为tz或时区信息。有大量具有不同搜索路径的IANA时区,用于为日期和时间对象指定IANA时区。例如,我们可以将搜索路径的名称作为Continent / City传递给日期时间对象,以设置其tzinfo。



dt: datetime = datetime(2000, 01, 25, 01, tzinfo=ZoneInfo("Europe/London"))


如果我们输入了错误的密钥,将抛出异常

zoneinfo.ZoneInfoNotFoundError

PEP 616



新的字符串函数可删除前缀和后缀。两个新功能已添加



str对象。



  • 第一个函数删除前缀。
    str.removeprefix(prefix)
  • 第二个功能删除后缀。
    str.removesuffix(suffix)


>>> 'hello_world'.removeprefix ('hello_') 
world
>>> 'hello_world'.removesuffix ('_world') 
hello


PEP 617



Python 3.9建议用高性能且稳定的新的基于PEG的解析器替换当前基于LL(1)的Python解析器。



当前的CPython解析器基于L​​L(1)。随后,语法基于LL(1),从而可以使用LL(1)解析器对其进行解析。 LL(1)解析器从上到下工作。另外,它从左到右解析输入数据。当前语法是上下文无关语法,因此不考虑标记上下文。

Python 3.9建议用新的基于PEG的解析器替换它,这意味着它将消除Python的LL语法的当前限制(1)。此外,目前的解析器已得到修复,增加了一些将被删除的hack。结果,这将长期降低维护成本。



例如,虽然LL(1)解析器和语法易于实现,但约束阻止了它们以自然的方式为语言设计者和读者表达常见的构造。解析器仅向前看一个令牌以区分各种可能性。



问题30966



取消同时期货的能力



新参数cancel_futures已添加到current.futures.Executor.shutdown ()中



此参数包含所有尚未开始的未决期货。在3.9版之前,该过程在退出执行程序之前等待它们完成。



新参数cancel_futures已添加到ThreadPoolExecutorProcessPoolExecutor中。它在参数值为True时起作用,然后在调用shutdown()函数时将取消所有未决的期货



关闭()执行完后,解释器检查执行器是否被垃圾回收。如果仍在内存中,它将获取所有待处理项目,然后取消期货。



问题30966



此版本中对异步和多处理库进行了许多改进。



例如,



  1. 由于重大安全问题,不再支持重用地址参数asyncio.loop.create_datagram_endpoint()
  2. 添加了新的协程,shutdown_default_executor()asyncio.to_thread()协程asyncio.to_thread()的新调用用于在单独的线程上运行与I / O相关的功能,以避免阻塞事件循环。


至于对多处理库的增强,已向multiprocessing.SimpleQueue添加了新的close()方法



此方法显式关闭队列。这样可以确保队列关闭并且停留时间不会超过预期的时间。重要的是要记住,关闭队列后不能调用get(),put(),empty()方法



发行37444



修复了导入包的错误。



在3.9版之前导入Python库的主要问题是,当其顶级包传递相对导入时,Python中的导入行为不一致。



建宏.__进口__()提出一个ValueError而导入库.__进口__()提出一个ImportError。



现在已更正__Import __()现在引发ImportError而不是ValueError。



问题40286



生成随机字节。



在3.9版中添加的另一个功能是random.Random.randbytes()。它可用于生成随机字节。



我们可以生成随机数,但是如果我们需要生成随机字节怎么办?在3.9版之前,开发人员必须具有创造力才能生成随机字节。虽然我们可以用os.getrandom() os.urandom(),secrets.token_bytes(),我们不能产生伪随机模式。



例如,为了确保生成具有预期行为的随机数并重现过程,我们通常将种子与random.Random模块一起使用。



结果,引入了random.Random.randbytes()方法它生成随机字节。



发行28029



字符串替换功能的更正。



replace函数的原理是,对于给定的最大自变量替换事件,它将用新的字符集替换字符串中的字符集。



为了进一步解释该问题,在3.9版之前,replace函数的行为不一致:



有人希望看到博客



"" .replace ("", "blog", 1) 
>>> '' 




人们期望看到|



"" .replace ("", "|", 1) 
>>> '' 




"" .replace ("", "prefix") 
>>> 'prefix'




问题39648,问题39479,问题39288,问题39310



“数学”模块中的更改。



返回整数参数的最小公倍数:



>>> import  math 
>>> math.lcm(48,72,108) 
432




返回整数参数的最大公约数。在早期版本中,仅支持两个参数。增加了对任意数量参数的支持:



>>> import  math 
>>> math.gcd(9,12,21) 
3




计算在y方向上最接近“ x浮点数



>>> math.nextafter(2, -1)
1.9999999999999998




此方法返回浮点数x的最低有效位的值。



>>> 1 - math.ulp(1)
0.9999999999999998
>>> math.nextafter(1, -1) + math.ulp(1)
1.0




问题38870



unparse方法已添加到ast模块。

新方法可用于创建一行代码,然后执行它。



>>> import ast
>>> parsed = ast.parse('from sys import platform; print(platform)')
>>> unparsed_str = ast.unparse(parsed)
>>> print(unparsed_str)
from sys import platform
print(platform)
>>> exec(unparsed_str)
win32




发行39507,发行39509



向http.HTTPStatus添加新代码。



保存418!

418 IM_A_TEAPOT
103 EARLY_HINTS
425 TOO_EARLY




UPD

PEP 614



放宽装饰者的语法限制。



它是:



buttons = [QPushButton(f'Button {i}') for i in range(10)]

button_0 = buttons[0]

@button_0.clicked.connect
def spam():
    ...

button_1 = buttons[1]

@button_1.clicked.connect
def eggs():
    ...


现在,您可以删除不必要的分配并直接致电:



buttons = [QPushButton(f'Button {i}') for i in range(10)]

@buttons[0].clicked.connect
def spam():
    ...

@buttons[1].clicked.connect
def eggs():
    ...




“元组必须放在括号中。”



这是基于Guido在同一封信中的愿景。引用:



但是我不允许逗号。我不同意



@f, g
def pooh(): ...


这可能导致没有经验的程序员得出这样的结论:可以以这种方式连续调用多个装饰器。需要括号来澄清所有内容,而没有其他限制或复杂的语法。




问题17005



新的graphlib模块提供了对哈希节点图进行拓扑排序的功能。

可以在文档中找到更多详细信息



UPD伊菲尼克

图片



>>> from graphlib import TopologicalSorter 
>>> graph = {'E': {'C', 'F'}, 'D': {'B', 'C'}, 'B': {'A'}, 'A': {'F'}} 
>>> ts = TopologicalSorter(graph) 
>>> tuple(ts.static_order()) 
('C', 'F', 'E', 'A', 'B', 'D')
>>> tuple(ts.static_order())
('F', 'C', 'A', 'E', 'B', 'D')


该图不能立即传输,但可以使用add方法填充TopologicalSorter此外,该类适用于并行计算,并可用于例如创建任务队列。



问题37630,问题40479



更新hashlib。

Hashlib现在可以使用来自OpenSSL的SHA3和SHAKE XOF哈希。

现在可以禁用或有选择地启用内置的哈希模块,例如,以实施基于OpenSSL的实现。



优化



从Python 3.4到Python 3.9的性能改进摘要:



Python version                       3.4     3.5     3.6     3.7     3.8    3.9
--------------                       ---     ---     ---     ---     ---    ---

Variable and attribute read access:
    read_local                       7.1     7.1     5.4     5.1     3.9    4.0
    read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.8
    read_global                     15.5    19.0    14.3    13.6     7.6    7.7
    read_builtin                    21.1    21.6    18.5    19.0     7.5    7.7
    read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   18.6
    read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   20.1
    read_instancevar                32.4    33.1    28.0    26.3    25.4   27.7
    read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   24.5
    read_namedtuple                 73.8    57.5    45.0    46.8    18.4   23.2
    read_boundmethod                37.6    37.9    29.6    26.9    27.7   45.9

Variable and attribute write access:
    write_local                      8.7     9.3     5.5     5.3     4.3    4.2
    write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.9
    write_global                    19.7    21.2    18.0    18.0    15.8   17.2
    write_classvar                  92.9    96.0   104.6   102.1    39.2   43.2
    write_instancevar               44.6    45.8    40.0    38.9    35.5   40.7
    write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   27.7

Data structure read access:
    read_list                       24.2    24.5    20.8    20.8    19.0   21.1
    read_deque                      24.7    25.5    20.2    20.6    19.8   21.6
    read_dict                       24.3    25.7    22.3    23.0    21.0   22.5
    read_strdict                    22.6    24.3    19.5    21.2    18.9   21.6

Data structure write access:
    write_list                      27.1    28.5    22.5    21.6    20.0   21.6
    write_deque                     28.7    30.1    22.7    21.8    23.5   23.2
    write_dict                      31.4    33.3    29.3    29.2    24.7   27.8
    write_strdict                   28.4    29.9    27.5    25.2    23.1   29.8

Stack (or queue) operations:
    list_append_pop                 93.4   112.7    75.4    74.2    50.8   53.9
    deque_append_pop                43.5    57.0    49.4    49.2    42.5   45.5
    deque_append_popleft            43.7    57.3    49.7    49.7    42.8   45.5

Timing loop:
    loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3


测试脚本以纳秒为单位显示时间。测试是在Intel Core i7-4960HQ处理器上进行的在存储库中的工具/脚本/var_access_benchmark.py ”中可以找到测试代码



感谢您的关注。



链接到Python 3.9官方手册

如果您错过了某些内容,请退订评论。



All Articles