Python 3.8安定版が正式に発表され、新しい特性が全面的に解読された.


以前からPythonの新バージョンに関するドキュメントが公式に更新されていましたが、昨日Python 3.8の安定版が正式に発表されました.新バージョンにはどのような新しい特性があるのでしょうか.
Python 3.8.0安定版の新特性
PEP 572,代入式
新しい構文があります.=大きな式の一部として変数に値を割り当てることができます.ゾウの目や象牙に似ていることから「ゾウオペレータ」と親しまれている.
この例では、付与式はlen()の呼び出しを2回回避するのに役立ちます.
if (n := len(a)) > 10:
    print(f"List is too long ({n} elements, expected <= 10)")

正規表現が一致している間に同様のメリットが得られます.一致するオブジェクトが2回必要です.1回は一致するかどうかをテストし、もう1回はサブグループを抽出します.
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
    discount = float(mo.group(1)) / 100.0

この演算子はwhileループにも役立ち、ループの終了をテストするために値を計算し、ループボディで再び同じ値を必要とします.
# Loop over fixed length blocks
while (block := f.read(256)) != '':
    process(block)

もう1つの啓発的な例は、フィルタ条件で計算された値を式本体に必要とするリスト理解にあります.
[clean_name.title() for name in names
 if (clean_name := normalize('NFC', name)) in allowed_names]

海象演算子の使用を制限して、複雑さを低減し、可読性を向上させるケースをクリーンアップしようとします.
PEP 570、位置のみのパラメータ
特定の関数パラメータが場所で指定され、キーワードパラメータとして使用できないことを示す新しい関数パラメータ構文があります.このhelp()は、Larry HastingsのArgument Clinicツールで注釈されたC関数で表示される記号と同じです.
コンパイル用バイトコードパラレルファイルシステムキャッシュ
新しいPYTHONPYCACHEPREFIX設定(または)は、各ソースディレクトリのデフォルトのサブディレクトリではなく、個別のパラレルファイルシステムツリーを使用するように暗黙的なバイトコードキャッシュを構成します.-X pycache_prefixpycache
キャッシュの場所はsysに報告されます.pycache_prefix(Noneはpycacheサブディレクトリのデフォルトの場所を示します).
デバッグバージョンとリリースバージョンの共有ABI
リリースモードでもデバッグモードでもPythonは同じABIを使用しています.Unixでは、Pythonがデバッグモードで構築された場合、モデル構築のC拡張と安定ABIで構築されたC拡張をロードできるようになりました
f文字列は便利な=説明子をサポートしてデバッグする
=f-stringに説明子を追加します.f文字列(たとえば)f'{expr=}'は、式のテキスト、等号に拡張され、評価式の表現形式に拡張されます.
PEP 578:Python運転時監査フック
PEPには、「監査フック」と「検証済みオープンフック」が追加されています.どちらもPythonとネイティブコードから入手できます.これにより、純粋なPythonコードで作成されたアプリケーションとフレームワークが追加の通知を利用することができます.また、埋め込みプログラムまたはシステム管理者が常にレビューを有効にしてPythonバージョンを導入することもできます.
PEP 587:Python初期化構成
PEP 587に新しいC APIが追加され、Python初期化が構成され、構成全体のより良い制御とより良いエラーレポートが提供される.
このPEPはこれらの内部構造にも_を追加した.PyRuntimeState.preconfig(PyPreConfigタイプ)とPyInterpreterState.config(PyConfigタイプ)フィールド.PyInterpreterState.configは新しい参照構成となり、グローバル構成変数とその他のプライベート変数を置き換えます.
Vectorcall:CPythonのクイックコールプロトコル
「vectorcall」プロトコルがPython/C APIに追加されました.これは、すでにさまざまなクラスに対して行われている既存の最適化を形式化することを目的としています.このプロトコルは、呼び出し可能な拡張タイプを実装する場合に使用できます.現在は一時的で、Python 3.9で完全に公開することを目的としています.
pickleプロトコル5は、帯域外データバッファを出力するために使用される
pickleがPythonプロセス間で大きなデータを転送してマルチコアまたはマルチコンピュータ処理を利用する場合、メモリコピーを低減し、カスタムテクノロジー(例えば、データ依存圧縮)を適用することによって転送を最適化することが重要である.
pickleプロトコル5は、通信層の判断に従ってPEP 3118と互換性のあるデータをプライマリpickleストリームから分離して送信することをサポートする帯域外バッファを導入する.
その他の言語の変化
一つのcontinue説は不法finally条項の原因と実施問題である.Python 3.8では、この制限はキャンセルされました.continueは現在finally:ブロックにあります.
このintタイプはas_を持つようになりましたinteger_ratio()と既存float.as_integer_ratio()メソッド互換の新しいメソッド.
N{name}へのサポートが追加されました.
Dictとdictviewsは、逆挿入順序を使用して反復reversed()を行うことができます.
関数呼び出しでキーワード名を許可する構文はさらに制限されます.特に、f((keyword)=arg)は許可されない.
カッコyield文とreturn文を使用せずに、Iterableをパッケージ解除できます.
有効なエスケープシーケンスではない逆スラッシュ文字対DepresationWarningはPython 3.6から生成されます.Python 3.8ではSyntaxWarningの代わりにSyntaxWarningが生成されます.
SyntaxWarningコンパイラは、場合によっては、メタグループまたはリストの前にカンマを逃したときに生成されます.
サブクラス間の算術演算datetime.dateまたはdatetime.datetimeとdatetime.timedeltaオブジェクトは、ベースクラスではなくサブクラスのインスタンスを返します.これは、datetimeの使用(直接または間接)にも影響する.timedelta算術の操作の戻りタイプ.例えばdatetime.datetime.astimezone().
PythonインタプリタがCtrl-C(SIGINT)によって中断され、KeyboardInterruptがキャプチャされていない結果が異常である場合、PythonプロセスはSIGINT信号または正しい終了コードによって終了し、呼び出しプロセスがCtrlによる死亡-Cを検出できるようになった.POSIXとWindowsのshellは、インタラクティブセッションのスクリプトを正しく終了するために使用します.
.........
新しいモジュール
新しいimportlib.metadataモジュールは、サードパーティ製パッケージからメタデータを読み出すための(一時的な)サポートを提供します.たとえば、インストールされているパッケージのバージョン番号、エントリポイントのリストなどを抽出できます.
>>> # Note following example requires that the popular "requests"
>>> # package has been installed.
>>>
>>> from importlib.metadata import version, requires, files
>>> version('requests')
'2.22.0'
>>> list(requires('requests'))
['chardet (<3.1.0,>=3.0.2)']
>>> list(files('requests'))[:5]
[PackagePath('requests-2.22.0.dist-info/INSTALLER'),
 PackagePath('requests-2.22.0.dist-info/LICENSE'),
 PackagePath('requests-2.22.0.dist-info/METADATA'),
 PackagePath('requests-2.22.0.dist-info/RECORD'),
 PackagePath('requests-2.22.0.dist-info/WHEEL')]

モジュールの改良
非同期
実行するとローカル非同期REPLが起動します.これにより、トップレベルのコードを持つコードを迅速にテストできます.直接呼び出す必要はありません.これにより、呼び出すたびに新しいイベントループが生成されます.python-m asyncioawaitasyncio.run()
$ python -m asyncio
asyncio REPL 3.8.0
Use "await" directly instead of "asyncio.run()".
Type "help", "copyright", "credits" or "license" for more information.
>>> import asyncio
>>> await asyncio.sleep(10, result='hello')
hello

Windowsでは、デフォルトのイベントループがProactorEventLoopになります.
AST
ASTノードにend_があるlinenoとend_col_offsetプロパティで、ノードの末端の正確な位置を指定できます.(これはlinenoとcol_offsetのプロパティを持つノードにのみ適用されます.)
新しい関数ast.get_source_segment()は、特定のASTノードのソースコードを返します.
このast.parse()関数には、いくつかの新しいフラグがあります.
type_comments=Trueは、テキストPEP 484と、特定のASTノードに関連付けられたPEP 526タイプの注釈とを返す.
mode='func_type'は、機能定義ASTノードに対して返されるPEP 484「署名タイプコメント」を解析するために使用することができる.
feature_version=(3,N)では、以前のPython 3バージョンを指定できます.(たとえば、和は非予約語とみなされます.)feature_version=(3, 4)asyncawait
しゅうごう
今の_方法namedtuple()はcollectionsではなくdictを返す.OrderedDict.実行可能なのは、3.7以降、通常のコマンドがソートを保証しているからです.他の機能OrderedDictが必要な場合は、結果を必要なタイプに変換することを推奨します.OrderedDict(nt._asdict()です.
日付時刻
新しい代替構造関数datetimeが追加されました.date.义齿datetime.fromisocalendar()は、ISO年、週番号、平日からdateオブジェクトとdatetimeオブジェクトをそれぞれ構築します.これらは各クラスのisocalendar法の逆関数である.
GC
get_objects()は、オブジェクトの生成を取得することを示すオプションの生成パラメータを受信することができるようになった.
ユニットテスト
AsyncMockがサポートする非同期バージョンMockを追加します.テストに使用する適切な新しい断言関数も追加されました.
addModuleCleanup()とaddClassCleanup()を追加してユニットテストを行い、setUpModule()とsetUpClass()のクリーンアップをサポートしました.
シミュレーションのブレークスルー関数の中には、失敗したときに実際に呼び出されたリストも印刷されます.
unittestこのモジュールは、unittestとともに使用できるコヒーレンスのサポートを得る.IsolatedAsyncioTestCase.
例:
import unittest

class TestRequest(unittest.IsolatedAsyncioTestCase):

    async def asyncSetUp(self):
        self.connection = await AsyncConnection()

    async def test_get(self):
        response = await self.connection.get("https://example.com")
        self.assertEqual(response.status_code, 200)

    async def asyncTearDown(self):
        await self.connection.close()

if __name__ == "__main__":
    unittest.main()

.........
その他
macOSでは、デフォルトではspawn startメソッドがマルチ処理で使用されています
マルチプロセッシング(multiprocessing)で共有メモリセグメントを使用できるようになりました
typed_ast合併CPython
LOAD_GLOBALは40%近くになりました
pickleは現在、プロトコル4をデフォルトで使用し、パフォーマンスを向上
新しい、改善の具体的な情報が多すぎて、詳しい私たちはbを一つ一つ羅列しないで、友达は自分で公式のドキュメントを見て新しい変更を理解することができます(住所:https://docs.python.org/3.8/whatsnew/changelog.html#changelog)