“这是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
标准集合中的泛型类型提示。
泛型是一种可以参数化的类型,是一种容器。也称为参数类型或通用类型。
此版本包括对“打字”模块中当前可用的所有标准集合的通用语法支持。我们可以使用list或dict类型作为泛型类型,而不是使用type.List或type.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
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解析器基于LL(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已添加到ThreadPoolExecutor和ProcessPoolExecutor中。它在参数值为True时起作用,然后在调用shutdown()函数时将取消所有未决的期货。
当关闭()执行完后,解释器检查执行器是否被垃圾回收。如果仍在内存中,它将获取所有待处理项目,然后取消期货。
问题30966
此版本中对异步和多处理库进行了许多改进。
例如,
- 由于重大安全问题,不再支持重用地址参数asyncio.loop.create_datagram_endpoint()。
- 添加了新的协程,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官方手册。
如果您错过了某些内容,请退订评论。