「これは、Windowsでデフォルトで64ビットインストーラーに設定されたPythonの最初のバージョンです。インストーラーは、Windows7へのインストールも積極的に禁止するようになりました。」
「これは、デフォルトでWindowsで64ビットインストーラーを使用するPythonの最初のバージョンです。インストーラーは、Windows7へのインストールも防止するようになりました。」
Python3.9のリリースノートと関連するディスカッションを読みました。その情報に基づいて、誰もが詳細な作業とともに機能のアイデアを得ることができるように、包括的なガイドを書きたいと思いました。
UPD:
安定した毎年恒例のリリースサイクルへの移行は、参照PEP 602を
alec_kalinin
「Pythonのすべての新しいバージョンが10月にリリースされます。Python 3.10は2021年10月にリリースされ、Python3.11は2022年10月にリリースされます。Buckfixは2か月ごとにリリースされます。これは私にとって素晴らしいニュースです。これで、Python環境のアップグレードを明確に計画できるようになりました。」
PEP 584
このPEPは、組み込みのdictクラスにmerge(|)およびupdate(| =)演算子を追加することを提案しています。
マージするには:|
>>> 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}
覚えておくべき重要なルールは、キーの競合がある場合、右端の値が保持されるということです。
もちろん、多くのpythonistsは質問をするでしょう、誰もがよく知っているオプションがすでにあるのなら、なぜこれが必要なのですか?
{**d1, **d2}
この質問は、PEP自体で回答されました。
辞書の開梱は見苦しく、簡単に検出できません。彼らが最初にそれを見たとき、これが何を意味するのかを推測できる人はほとんどいないでしょう。
Guidoが言ったように:
PEP 448についてお詫びしますが、より単純なコンテキストで** dについて知っていても、一般的なPythonユーザーに2つのdictを新しいものに組み合わせる方法を尋ねた場合、多くの人が{** d1、**を考えるとは思えません。 d2}。このスレッドが始まったとき、私はそれを自分で忘れていたことを知っています!
また、{** d1、** d2}はdefaultdictのようなdictサブクラスでは機能しません
PEP 585
ジェネリックスは、標準コレクションのヒントを入力します。
Genericは、パラメータ化できるタイプであり、一種のコンテナです。パラメトリックタイプまたはジェネリックタイプとも呼ばれます。
このリリースには、Typingモジュールで現在利用可能なすべての標準コレクションでのユニバーサル構文のサポートが含まれています。types.Listまたはtyping.Dictを使用する代わりに、listまたは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としてdatetimeオブジェクトに渡して、そのtzinfoを設定できます。
dt: datetime = datetime(2000, 01, 25, 01, tzinfo=ZoneInfo("Europe/London"))
間違ったキーを渡すと、例外がスローされます
zoneinfo.ZoneInfoNotFoundError
PEP 616
プレフィックスとサフィックスを削除する新しい文字列関数。strオブジェクトに2つの新しい関数が追加され
ました。
- 最初の関数はプレフィックスを削除します。
str.removeprefix(prefix)
- 2番目の関数はサフィックスを削除します。
str.removesuffix(suffix)
>>> 'hello_world'.removeprefix ('hello_')
world
>>> 'hello_world'.removesuffix ('_world')
hello
PEP 617
Python 3.9は、現在のLL(1)ベースのPythonパーサーを、高性能で安定した新しいPEGベースのパーサーに置き換えることを提案しています。
現在のCPythonパーサーはLL(1)に基づいています。その後、文法はLL(1)に基づいており、LL(1)パーサーで解析できます。 LL(1)パーサーは上から下に機能します。さらに、入力データを左から右に解析します。現在の文法はコンテキストフリーの文法であるため、トークンのコンテキストは考慮されません。
Python 3.9は、新しいPEGベースのパーサーに置き換えることを提案しています。これは、PythonのLL(1)文法の現在の制限を取り除くことを意味します。さらに、現在のパーサーに修正が加えられ、削除されるハックがいくつか追加されています。結果として、これは長期的なメンテナンスのコストを削減します。
たとえば、LL(1)パーサーと文法は簡単に実装できますが、制約により、言語の設計者と読者にとって自然な方法で一般的な構成を表現することはできません。パーサーは、可能性を区別するために1つのトークンのみを前方に探します。
issue30966
同時先物をキャンセルする機能。
新しいパラメータcancel_futuresがconcurrent.futures.Executor.shutdown()に追加されました。
このパラメーターには、まだ開始されていないすべての保留中の先物が含まれます。バージョン3.9より前では、プロセスはそれらが完了するのを待ってからエグゼキュータを終了していました。
新しいパラメータcancel_futuresがThreadPoolExecutorとProcessPoolExecutorに追加されました。パラメータ値がTrueの場合に機能し、shutdown()関数が呼び出されると、保留中のすべての先物がキャンセルされます。
ときにシャットダウン()が実行されると、インタプリタは実行者がガベージ収集されているかどうかを確認します。それがまだメモリにある場合は、保留中のすべてのアイテムを取得してから、先物をキャンセルします。
issue30966
このリリースでは、非同期およびマルチプロセッシングライブラリに多くの改善が加えられました。
例えば、
- 重大なセキュリティ問題のため、reuse_addressパラメータasyncio.loop.create_datagram_endpoint()はサポートされなくなりました。
- 新しいcoroutines 、shutdown_default_executor()、およびasyncio.to_thread()coroutinesが追加されました。asyncio.to_thread()の新しい呼び出しを使用して、I / O関連の関数を別のスレッドで実行し、イベントループのブロックを回避します。
マルチプロセッシングライブラリの機能強化として、multiprocessing.SimpleQueueクラスに新しいclose()メソッドが追加されました。
このメソッドは、キューを明示的に閉じます。これにより、キューが閉じられ、予想より長く留まることはありません。キューが閉じられた後は、get()、put()、empty()メソッドを呼び出すことができないことを覚えておくことが重要です。
issue37444
パッケージのインポートに関するバグを修正しました。
3.9リリースより前のPythonライブラリのインポートに関する主な問題は、相対インポートが最上位パッケージによって渡された場合のPythonでの一貫性のないインポート動作でした。
ビルトイン.__ import __()はValueErrorを発生させ、importlib .__ import __()はImportErrorを発生させました。
これで修正されました。__Import __()は、ValueErrorではなくImportErrorを発生させるようになりました。
issue40286
ランダムバイトの生成。
バージョン3.9で追加されたもう1つの機能は、random.Random.randbytes()です。ランダムなバイトを生成するために使用できます。
ランダムな数値を生成できますが、ランダムなバイトを生成する必要がある場合はどうなりますか?バージョン3.9より前は、開発者はランダムなバイトを生成するために創造的でなければなりませんでした。私たちが使用できますがos.getrandom() 、os.urandom()またはsecrets.token_bytesを()私たちは、擬似ランダムパターンを生成することはできません。
たとえば、ランダムな数値が期待される動作で生成され、プロセスが再現されるようにするために、通常、random.Randomモジュールでシードを使用します。
その結果、random.Random.randbytes()メソッドが導入されました。ランダムなバイトを生成します。
issue28029
文字列置換機能の修正。
replace関数の原理は、オカレンスを置き換えるための特定の最大引数に対して、文字列の文字セットを新しい文字セットに置き換えることです。
問題をさらに説明するために、バージョン3.9より前では、置換機能の動作に一貫性がありませんでした。
ブログが表示されると予想されます。
"" .replace ("", "blog", 1)
>>> ''
見ることを期待するだろう|
"" .replace ("", "|", 1)
>>> ''
"" .replace ("", "prefix")
>>> 'prefix'
issue39648、issue39479、issue39288、issue39310
「数学」モジュールの変更。
整数引数の最も一般的でない倍数を返します。
>>> import math
>>> math.lcm(48,72,108)
432
整数引数の最大の一般的な除数を返します。以前のバージョンは2つの引数のみをサポートしていました。任意の数の引数のサポートが追加されました。
>>> 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
issue38870
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
issue39507、issue39509
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(): ...
これにより、経験の浅いプログラマーは、この方法で複数のデコレーターを連続して呼び出すことができるという結論に達する可能性があります。括弧は、追加の制限や複雑な構文なしですべてを明確にするために必要です。
issue17005
新しいgraphlibモジュールは、ハッシュされたノードのグラフをトポロジ的に並べ替えるための機能を提供します。
詳細については、ドキュメントをご覧ください。
UPD:ifinik
>>> 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に入力します。さらに、このクラスは並列コンピューティングに適合しており、たとえば、タスクキューを作成するために使用できます。
issue37630、issue40479
hashlibライブラリを更新しています。
Hashlibは、OpenSSLのSHA3およびSHAKEXOFハッシュを使用できるようになりました。
組み込みのハッシュモジュールを無効にするか、選択的に有効にして、たとえばOpenSSLベースの実装を実施できるようになりました。
最適化
Python3.4からPython3.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 Corei7-4960HQプロセッサで実行されました。テストコードは、リポジトリの「ツール/スクリプト/var_access_benchmark.py」にあります。
清聴ありがとうございました。
公式のPython3.9マニュアルへのリンク。
あなたが何かを逃したならば、コメントで退会してください。