Python3.9.0安定版リリース

Python 3.9.0安定版は、本日2020年10月5日にリリースされる予定です。新しいバージョンは、約18か月間、約2か月ごとにパッチが適用された更新を受け取ります。最終バージョン3.10.0のリリース後しばらくして、9番目の最終アップデートがバグ修正3.9とともにリリースされます。



「これは、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



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がThreadPoolExecutorProcessPoolExecutorに追加されました。パラメータ値がTrueの場合に機能し、shutdown()関数が呼び出されると、保留中のすべての先物がキャンセルされます。



ときにシャットダウン()が実行されると、インタプリタは実行者がガベージ収集されているかどうかを確認します。それがまだメモリにある場合は、保留中のすべてのアイテムを取得してから、先物をキャンセルします。



issue30966



このリリースでは、非同期およびマルチプロセッシングライブラリに多くの改善が加えられました。



例えば、



  1. 重大なセキュリティ問題のため、reuse_addressパラメータasyncio.loop.create_datagram_endpoint()はサポートされなくなりました。
  2. 新しい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モジュールは、ハッシュされたノードのグラフをトポロジ的に並べ替えるための機能を提供します。

詳細については、ドキュメントをご覧ください



UPDifinik

画像



>>> 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マニュアルへのリンク

あなたが何かを逃したならば、コメントで退会してください。



All Articles