Python3.8の新機能
- 編集者
- レイモンドヘッティンガー
この記事では、3.7と比較したPython3.8の新機能について説明します。 詳細については、 changelog を参照してください。
Python3.8は2019年10月14日にリリースされました。
概要–リリースのハイライト
新機能
代入式
より大きな式の一部として変数に値を割り当てる新しい構文:=
があります。 セイウチの目と牙に似ていることから、愛情を込めて「セイウチのオペレーター」として知られています。
この例では、代入式は 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)
別の動機付けのユースケースは、リスト内包表記で発生します。この場合、フィルタリング条件で計算された値が式の本体でも必要になります。
[clean_name.title() for name in names
if (clean_name := normalize('NFC', name)) in allowed_names]
複雑さを軽減し、読みやすさを向上させるケースをクリーンアップするために、セイウチ演算子の使用を制限するようにしてください。
詳細については、 PEP 572 を参照してください。
(:issue: `35224` でEmilyMorehouseによって寄稿されました。)
位置のみのパラメーター
一部の関数パラメーターは位置的に指定する必要があり、キーワード引数として使用できないことを示す新しい関数パラメーター構文/
があります。 これは、LarryHastingsの Argument Clinic ツールで注釈が付けられたC関数のhelp()
で示される表記と同じです。
次の例では、パラメータ a および b は位置のみであり、 c または d は位置またはキーワードであり、[ X149X] e または f はキーワードである必要があります。
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
以下は有効な呼び出しです。
f(10, 20, 30, d=40, e=50, f=60)
ただし、これらは無効な呼び出しです。
f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60) # e must be a keyword argument
この表記法の1つの使用例は、純粋なPython関数が既存のCコード化関数の動作を完全にエミュレートできるようにすることです。 たとえば、組み込みの divmod()関数は、キーワード引数を受け入れません。
def divmod(a, b, /):
"Emulate the built in divmod() function"
return (a // b, a % b)
もう1つの使用例は、パラメーター名が役に立たない場合にキーワード引数を除外することです。 たとえば、組み込みの len()関数には、署名len(obj, /)
があります。 これにより、次のような厄介な呼び出しが排除されます。
len(obj='hello') # The "obj" keyword argument impairs readability
パラメータを位置のみとしてマークすることのさらなる利点は、クライアントコードを壊すリスクなしに、パラメータ名を将来変更できることです。 たとえば、 statistics モジュールでは、パラメータ名 dist が将来変更される可能性があります。 これは、次の機能仕様で可能になりました。
def quantiles(dist, /, *, n=4, method='exclusive')
...
/
の左側のパラメーターは可能なキーワードとして公開されていないため、パラメーター名は**kwargs
で引き続き使用できます。
>>> def f(a, b, /, **kwargs):
... print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3) # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}
これにより、任意のキーワード引数を受け入れる必要のある関数とメソッドの実装が大幅に簡素化されます。 たとえば、 collections モジュールのコードからの抜粋を次に示します。
class Counter(dict):
def __init__(self, iterable=None, /, **kwds):
# Note "iterable" is a possible keyword argument
詳細については、 PEP 570 を参照してください。
(:issue: `36540` のPabloGalindoによる寄稿。)
コンパイルされたバイトコードファイル用の並列ファイルシステムキャッシュ
新しい PYTHONPYCACHEPREFIX 設定( -X pycache_prefix
としても利用可能)は、個別の並列ファイルシステムツリーではなく、個別の並列ファイルシステムツリーを使用するように暗黙的なバイトコードキャッシュを構成します各ソースディレクトリ内のデフォルトの__pycache__
サブディレクトリ。
キャッシュの場所は sys.pycache_prefix で報告されます( None は、__pycache__
サブディレクトリのデフォルトの場所を示します)。
(:issue: `33499` でCarlMeyerによって寄稿されました。)
デバッグビルドは、リリースビルドと同じABIを使用します
Pythonは、リリースモードでもデバッグモードでも同じABIを使用するようになりました。 Unixでは、Pythonがデバッグモードでビルドされている場合、リリースモードでビルドされたC拡張機能と、安定したABIを使用してビルドされたC拡張機能をロードできるようになりました。
リリースビルドとデバッグビルドはABI互換になりました。Py_DEBUG
マクロを定義しても、Py_TRACE_REFS
マクロを意味しなくなり、ABIの非互換性のみが発生します。 sys.getobjects()
関数と PYTHONDUMPREFS 環境変数を追加するPy_TRACE_REFS
マクロは、新しい./configure --with-trace-refs
ビルドを使用して設定できます。オプション。 (:issue: `36465` でVictorStinnerによって寄稿されました。)
Unixでは、AndroidとCygwinを除いて、C拡張機能はlibpythonにリンクされなくなりました。 静的にリンクされたPythonが、共有ライブラリPythonを使用して構築されたC拡張機能をロードできるようになりました。 (:issue: `21536` でVictorStinnerによって寄稿されました。)
Unixでは、Pythonがデバッグモードでビルドされている場合、importはリリースモードでコンパイルされたC拡張機能と、安定したABIでコンパイルされたC拡張機能も検索するようになりました。 (:issue: `36722` でVictorStinnerによって寄稿されました。)
Pythonをアプリケーションに埋め込むには、新しい--embed
オプションをpython3-config --libs --embed
に渡して、-lpython3.8
を取得する必要があります(アプリケーションをlibpythonにリンクします)。 3.8以前の両方をサポートするには、最初にpython3-config --libs --embed
を試し、前のコマンドが失敗した場合はpython3-config --libs
(--embed
なし)にフォールバックします。
pkg-config python-3.8-embed
モジュールを追加して、Pythonをアプリケーションに埋め込みます。pkg-config python-3.8-embed --libs
には-lpython3.8
が含まれています。 3.8以前の両方をサポートするには、最初にpkg-config python-X.Y-embed --libs
を試し、前のコマンドが失敗した場合はpkg-config python-X.Y --libs
(--embed
なし)にフォールバックします(X.Y
をPythonバージョンに置き換えます) )。
一方、pkg-config python3.8 --libs
には-lpython3.8
が含まれなくなりました。 C拡張機能はlibpythonにリンクしてはなりません(AndroidとCygwinを除き、その場合はスクリプトによって処理されます)。 この変更は、意図的に後方互換性がありません。 (:issue: `36721` でVictorStinnerによって寄稿されました。)
f-stringsは、自己文書化式とデバッグのために=をサポートします
=
指定子を f-string に追加しました。 f'{expr=}'
などのf文字列は、式のテキスト、等号、評価された式の表現に展開されます。 例えば:
>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
通常の f-string形式指定子を使用すると、式の結果の表示方法をより細かく制御できます。
>>> delta = date.today() - member_since
>>> f'{user=!s} {delta.days=:,d}'
'user=eric_idle delta.days=16,075'
=
指定子は式全体を表示するため、計算を表示できます。
>>> print(f'{theta=} {cos(radians(theta))=:.3f}')
theta=30 cos(radians(theta))=0.866
(EricVによる寄稿。 のSmithとLarryHastings:issue: `36817` 。)
PEP 578:Pythonランタイム監査フック
PEPは、監査フックと検証済みオープンフックを追加します。 どちらもPythonとネイティブコードから利用できるため、純粋なPythonコードで記述されたアプリケーションとフレームワークは追加の通知を利用でき、埋め込み者やシステム管理者は監査が常に有効になっているPythonのビルドをデプロイできます。
詳細については、 PEP 578 を参照してください。
PEP 587:Python初期化構成
PEP 587 は、Python初期化を構成するための新しいC APIを追加して、構成全体をより細かく制御し、エラー報告を改善します。
新しい構造:
新機能:
PyConfig_Clear()
PyConfig_InitIsolatedConfig()
PyConfig_InitPythonConfig()
PyConfig_Read()
PyConfig_SetArgv()
PyConfig_SetBytesArgv()
PyConfig_SetBytesString()
PyConfig_SetString()
PyPreConfig_InitIsolatedConfig()
PyPreConfig_InitPythonConfig()
PyStatus_Error()
PyStatus_Exception()
PyStatus_Exit()
PyStatus_IsError()
PyStatus_IsExit()
PyStatus_NoMemory()
PyStatus_Ok()
PyWideStringList_Append()
PyWideStringList_Insert()
Py_BytesMain()
Py_ExitStatusException()
Py_InitializeFromConfig()
Py_PreInitialize()
Py_PreInitializeFromArgs()
Py_PreInitializeFromBytesArgs()
Py_RunMain()
このPEPは、_PyRuntimeState.preconfig
( PyPreConfig タイプ)およびPyInterpreterState.config
( PyConfig タイプ)フィールドもこれらの内部構造に追加します。 PyInterpreterState.config
が新しい参照構成になり、グローバル構成変数やその他のプライベート変数が置き換えられます。
ドキュメントについては、 Python初期化構成を参照してください。
詳細については、 PEP 587 を参照してください。
(:issue: `36763` でVictorStinnerによって寄稿されました。)
Vectorcall:CPythonの高速呼び出しプロトコル
「vectorcall」プロトコルがPython / CAPIに追加されました。 これは、さまざまなクラスに対してすでに行われた既存の最適化を形式化することを目的としています。 呼び出し可能オブジェクトを実装するすべての拡張タイプは、このプロトコルを使用できます。
これは現在暫定的なものです。 目的は、Python3.9で完全に公開することです。
詳細については、 PEP 590 を参照してください。
(:issue: `36974` でJeroenDemeyerとMarkShannonによって寄稿されました。)
帯域外データバッファを備えたPickleプロトコル5
マルチコアまたはマルチマシン処理を利用するために pickle を使用してPythonプロセス間で大きなデータを転送する場合、メモリコピーを減らし、場合によってはカスタム手法を適用して、転送を最適化することが重要です。データ依存の圧縮など。
pickle プロトコル5は、 PEP 3118 互換データをメインのpickleストリームとは別に送信できる、帯域外バッファーのサポートを導入しています。通信層の。
詳細については、 PEP 574 を参照してください。
(:issue: `36785` のAntoinePitrouによる寄稿。)
その他の言語の変更
continue ステートメントは、実装に問題があるため、 finally 句で不正でした。 Python 3.8では、この制限が解除されました。 (:issue: `32489` のSerhiyStorchakaによる寄稿。)
bool 、 int 、および fractions.Fraction タイプには、 float [にあるような as_integer_ratio()メソッドがあります。 X146X]および decimal.Decimal 。 このマイナーなAPI拡張機能により、
numerator, denominator = x.as_integer_ratio()
を記述して、複数の数値型で機能させることができます。 (:issue: `33073` のLisaRoachと:issue:` 37819` のRaymondHettingerによる寄稿。)int 、 float 、 complex のコンストラクターは、 __ index __()特殊メソッド(使用可能な場合)と対応するメソッドを使用するようになりました。 __int __()、 __ float __()または __ complex __()は使用できません。 (:issue: `20092` でSerhiyStorchakaによって寄稿されました。)
正規表現での
\N{name}
エスケープのサポートが追加されました。>>> notice = 'Copyright © 2019' >>> copyright_year_pattern = re.compile(r'\N{copyright sign}\s*(\d{4})') >>> int(copyright_year_pattern.search(notice).group(1)) 2019
(:issue: `30688` でJonathanEuniceとSerhiyStorchakaによって寄稿されました。)
reverse()を使用して、ディクトビューとディクトビューを逆挿入順序で反復できるようになりました。 (:issue: `33462` のRémiLapeyreによる寄稿。)
関数呼び出しでキーワード名に使用できる構文はさらに制限されていました。 特に、
f((keyword)=arg)
は許可されなくなりました。 キーワード引数割り当て用語の左側に裸の名前以上のものを許可することは決して意図されていませんでした。 (:issue: `34641` でBenjaminPetersonによって寄稿されました。)yield および return ステートメントでの一般化された反復可能なアンパックでは、括弧を囲む必要がなくなりました。 これにより、 yield および return 構文が通常の代入構文とよりよく一致するようになります。
>>> def parse(family): lastname, *members = family.split() return lastname.upper(), *members >>> parse('simpsons homer marge bart lisa sally') ('SIMPSONS', 'homer', 'marge', 'bart', 'lisa', 'sally')
(:issue: `32117` でDavidCuthbertとJordanChapmanによって寄稿されました。)
[(10, 20) (30, 40)]
などのコードでコンマが欠落している場合、コンパイラーは SyntaxWarning を役立つ提案とともに表示します。 これは、最初のタプルが呼び出せなかったことを示す TypeError があるだけで改善されます。 (:issue: `15248` のSerhiyStorchakaによる寄稿。)datetime.date または datetime.datetime および datetime.timedelta オブジェクトのサブクラス間の算術演算は、基本クラスではなく、サブクラスのインスタンスを返すようになりました。 これは、 astimezone()など、実装が(直接的または間接的に) datetime.timedelta 算術演算を使用する操作の戻りタイプにも影響します。 (:issue: `32417` でPaulGanssleによって寄稿されました。)
PythonインタープリターがCtrl-C(SIGINT)によって中断され、結果として生じる KeyboardInterrupt 例外がキャッチされない場合、PythonプロセスはSIGINTシグナルを介して、または呼び出しプロセスが検出できるように正しい終了コードで終了するようになりました。 Ctrl-Cが原因で死亡したこと。 POSIXおよびWindowsのシェルは、これを使用して、対話型セッションでスクリプトを適切に終了します。 (GregoryPを介してGoogleから寄稿されました。 のSmith:issue: `1054041` 。)
一部の高度なプログラミングスタイルでは、既存の関数の types.CodeType オブジェクトを更新する必要があります。 コードオブジェクトは不変であるため、既存のコードオブジェクトをモデルにした新しいコードオブジェクトを作成する必要があります。 19個のパラメーターがあるため、これはやや面倒でした。 現在、新しい
replace()
メソッドにより、いくつかの変更されたパラメーターを使用してクローンを作成できます。statistics.mean()関数を変更して、 data パラメーターがキーワード引数として使用されないようにする例を次に示します。
>>> from statistics import mean >>> mean(data=[10, 20, 90]) 40 >>> mean.__code__ = mean.__code__.replace(co_posonlyargcount=1) >>> mean(data=[10, 20, 90]) Traceback (most recent call last): ... TypeError: mean() got some positional-only arguments passed as keyword arguments: 'data'
(:issue: `37032` でVictorStinnerによって寄稿されました。)
整数の場合、 pow()関数の3引数形式により、底が互いに素である場合に指数を負にすることができるようになりました。 次に、指数が
-1
の場合、ベースのモジュラ逆数を計算し、他の負の指数に対するその逆数の適切な累乗を計算します。 たとえば、137を法とする38のモジュラ逆数を計算するには、次のように記述します。>>> pow(38, -1, 137) 119 >>> 119 * 38 % 137 1
モジュラ逆数は、線形ディオファントス方程式の解で発生します。 たとえば、
4258𝑥 + 147𝑦 = 369
の整数解を見つけるには、最初に4258𝑥 ≡ 369 (mod 147)
と書き直してから、次のように解きます。>>> x = 369 * pow(4258, -1, 147) % 147 >>> y = (4258 * x - 369) // -147 >>> 4258 * x + 147 * y 369
(:issue: `36027` でMarkDickinsonによって寄稿されました。)
ディクト内包表記はディクトリテラルと同期されているため、キーが最初に計算され、値が2番目に計算されます。
>>> # Dict comprehension >>> cast = {input('role? '): input('actor? ') for i in range(2)} role? King Arthur actor? Chapman role? Black Knight actor? Cleese >>> # Dict literal >>> cast = {input('role? '): input('actor? ')} role? Sir Robin actor? Eric Idle
キー式で割り当てられた変数は値式で使用できるため、保証された実行順序は割り当て式で役立ちます。
>>> names = ['Martin von Löwis', 'Łukasz Langa', 'Walter Dörwald'] >>> {(n := normalize('NFC', name)).casefold() : n for name in names} {'martin von löwis': 'Martin von Löwis', 'łukasz langa': 'Łukasz Langa', 'walter dörwald': 'Walter Dörwald'}
(:issue: `35224` でJörnHeisslerによって寄稿されました。)
object .__ reduce __()メソッドは、2から6要素の長さのタプルを返すことができるようになりました。 以前は、5つが制限でした。 新しいオプションの6番目の要素は、
(obj, state)
署名を使用して呼び出すことができます。 これにより、特定のオブジェクトの状態更新動作を直接制御できます。 None でない場合、この呼び出し可能オブジェクトは、オブジェクトの__setstate__()
メソッドよりも優先されます。 (:issue: `35900` でPierreGlaserとOlivierGriselによって寄稿されました。)
新しいモジュール
新しい 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')]
(BarryWarsawとJasonRによる寄稿。 のクーム:issue: `34632` 。)
改善されたモジュール
ast
ASTノードにend_lineno
およびend_col_offset
属性が追加され、ノードの終わりの正確な位置がわかります。 (これは、lineno
およびcol_offset
属性を持つノードにのみ適用されます。)
新しい関数 ast.get_source_segment()は、特定のASTノードのソースコードを返します。
(:issue: `33416` でIvanLevkivskyiによって寄稿されました。)
ast.parse()関数には、いくつかの新しいフラグがあります。
type_comments=True
は、特定のASTノードに関連付けられた PEP 484 および PEP 526 タイプのコメントのテキストを返します。mode='func_type'
を使用して、 PEP 484 「署名タイプのコメント」(関数定義ASTノードに対して返される)を解析できます。feature_version=(3, N)
では、以前のPython3バージョンを指定できます。 たとえば、feature_version=(3, 4)
は async と await を予約されていない単語として扱います。
(:issue: `35766` でGuidovan Rossumによって寄稿されました。)
asyncio
asyncio.run()は、暫定APIから安定したAPIに移行しました。 この関数を使用すると、コルーチンを実行し、イベントループを自動的に管理しながら結果を返すことができます。 例えば:
import asyncio
async def main():
await asyncio.sleep(0)
return 42
asyncio.run(main())
これは、おおよそ[X19X]と同等です。
import asyncio
async def main():
await asyncio.sleep(0)
return 42
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
loop.run_until_complete(main())
finally:
asyncio.set_event_loop(None)
loop.close()
実際の実装はかなり複雑です。 したがって、 asyncio.run()は、非同期プログラムを実行するための推奨される方法です。
(:issue: `32314` でYurySelivanovによって寄稿されました。)
python -m asyncio
を実行すると、ネイティブに非同期のREPLが起動します。 これにより、トップレベルの await を持つコードをすばやく試すことができます。 asyncio.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
(:issue: `37028` でYurySelivanovによって寄稿されました。)
例外 asyncio.CancelledError は、 Exception ではなく BaseException から継承し、 concurrent.futures.CancelledError から継承しなくなりました。 (:issue: `32528` でYurySelivanovによって寄稿されました。)
Windowsでは、デフォルトのイベントループは ProactorEventLoop になりました。 (:issue: `34687` でVictorStinnerによって寄稿されました。)
ProactorEventLoop もUDPをサポートするようになりました。 (:issue: `29883` でAdamMeilyとAndrewSvetlovによって寄稿されました。)
ProactorEventLoop は、 KeyboardInterrupt (「CTRL + C」)によって中断できるようになりました。 (:issue: `23057` でVladimirMatveevによって寄稿されました。)
asyncio.Task 内でラップされたコルーチンを取得するための asyncio.Task.get_coro()を追加しました。 (:issue: `36999` のAlexGrönholmによる寄稿。)
name
キーワード引数を asyncio.create_task()または create_task()イベントループメソッドに渡すか、タスクオブジェクトの set_name()メソッド。 タスク名は、 asyncio.Task のrepr()
出力に表示され、 get_name()メソッドを使用して取得することもできます。 (:issue: `34270` のAlexGrönholmによる寄稿。)
Happy Eyeballs のサポートがasyncio.loop.create_connection()
に追加されました。 動作を指定するために、 happy_eyeballs_delay と interleave の2つの新しいパラメーターが追加されました。 Happy Eyeballsアルゴリズムは、IPv4とIPv6の両方を使用して同時に接続を試みることにより、IPv4とIPv6をサポートするアプリケーションの応答性を向上させます。 (:issue: `33530` のツイステロイドアンバサダーによる寄稿。)
ビルトイン
compile()ビルトインは、ast.PyCF_ALLOW_TOP_LEVEL_AWAIT
フラグを受け入れるように改善されました。 この新しいフラグが渡されると、 compile()は、通常は無効な構文と見なされるトップレベルのawait
、async for
、およびasync with
構造を許可します。 CO_COROUTINE
フラグでマークされた非同期コードオブジェクトが返される場合があります。 (:issue: `34616` でMatthiasBussonnierによって寄稿されました)
コレクション
collections.namedtuple()の _asdict()メソッドは、 collections.OrderedDict ではなく dict を返すようになりました。 これは、Python 3.7以降、通常のdictが順序付けを保証しているために機能します。 OrderedDict
の追加機能が必要な場合は、結果を目的のタイプOrderedDict(nt._asdict())
にキャストすることをお勧めします。 (:issue: `35864` でRaymondHettingerによって寄稿されました。)
cProfile
cProfile.Profile クラスをコンテキストマネージャーとして使用できるようになりました。 次のコマンドを実行して、コードのブロックをプロファイリングします。
import cProfile
with cProfile.Profile() as profiler:
# code to be profiled
...
(:issue: `29235` でScottSandersonによって寄稿されました。)
csv
csv.DictReader は、 collections.OrderedDict ではなく dict のインスタンスを返すようになりました。 このツールは、フィールドの順序を維持しながら、より高速になり、使用するメモリが少なくなりました。 (:issue: `34003` でMichaelSelikによって寄稿されました。)
のろい
基盤となるncursesライブラリの構造化バージョン情報を保持する新しい変数 ncurses_version を追加しました。 (:issue: `31680` でSerhiyStorchakaによって寄稿されました。)
ctypes
Windowsでは、 CDLL およびサブクラスが winmode パラメーターを受け入れて、基になるLoadLibraryEx
呼び出しのフラグを指定するようになりました。 デフォルトのフラグは、DLLが格納されているパス(最初のDLLのロードに完全または部分パスが使用されている場合)や add_dll_directory()によって追加されたパスなど、信頼できる場所からDLLの依存関係のみをロードするように設定されています。 。 (:issue: `36085` でSteveDowerによって寄稿されました。)
日付時刻
新しい代替コンストラクター datetime.date.fromisocalendar()および datetime.datetime.fromisocalendar()を追加しました。これらは、それぞれdate
および datetime オブジェクトを構築します。 ISOの年、週番号、および平日から。 これらは、各クラスのisocalendar
メソッドの逆です。 (:issue: `36004` でPaulGanssleによって寄稿されました。)
functools
functools.lru_cache()は、デコレータを返す関数としてではなく、ストレートデコレータとして使用できるようになりました。 したがって、これらの両方がサポートされるようになりました。
@lru_cache
def f(x):
...
@lru_cache(maxsize=256)
def f(x):
...
(:issue: `36772` でRaymondHettingerによって寄稿されました。)
インスタンスの存続期間中にキャッシュされる計算されたプロパティ用に、新しい functools.cached_property()デコレータが追加されました。
import functools
import statistics
class Dataset:
def __init__(self, sequence_of_numbers):
self.data = sequence_of_numbers
@functools.cached_property
def variance(self):
return statistics.variance(self.data)
(:issue: `21145` でCarlMeyerによって寄稿されました)
シングルディスパッチを使用してメソッドをジェネリック関数に変換する新しい functools.singledispatchmethod()デコレータを追加しました。
from functools import singledispatchmethod
from contextlib import suppress
class TaskManager:
def __init__(self, tasks):
self.tasks = list(tasks)
@singledispatchmethod
def discard(self, value):
with suppress(ValueError):
self.tasks.remove(value)
@discard.register(list)
def _(self, tasks):
targets = set(tasks)
self.tasks = [x for x in self.tasks if x not in targets]
(:issue: `32380` でEthanSmithによって寄稿されました)
gc
get_objects()は、オブジェクトを取得する世代を示すオプションの generation パラメーターを受け取ることができるようになりました。 (:issue: `36016` のPabloGalindoによる寄稿。)
gettext
pgettext()とそのバリアントを追加しました。 (:issue: `2504` で、Franz Glasner、ÉricAraujo、およびCheryl Sabellaによって寄稿されました。)
gzip
再現性のある出力のために、 mtime パラメーターを gzip.compress()に追加しました。 (:issue: `34898` のGuoCi Teoによる寄稿。)
特定の種類の無効または破損したgzipファイルに対して、 OSError ではなく BadGzipFile 例外が発生するようになりました。 (:issue: `6584` のFilipGruszczyński、MicheleOrrù、およびZackery Spytzによる寄稿。)
IDLEとidlelib
N行(デフォルトでは50)を超える出力は、ボタンに絞り込まれます。 Nは、[設定]ダイアログの[一般]ページの[PyShell]セクションで変更できます。 出力を右クリックすることで、より少ないが、場合によっては非常に長い行を絞ることができます。 スクイーズされた出力は、ボタンをダブルクリックして所定の位置に展開するか、ボタンを右クリックしてクリップボードまたは別のウィンドウに展開できます。 (:issue: `1529353` のTalEinatによる寄稿。)
カスタマイズされた設定でモジュールを実行するには、「実行」メニューに「カスタマイズされた実行」を追加します。 入力されたコマンドライン引数はすべてsys.argvに追加されます。 また、次のカスタマイズされた実行のためにボックスに再表示されます。 通常のシェルメインモジュールの再起動を抑制することもできます。 (:issue: `5680` および:issue:` 37627` で、Cheryl Sabella、Terry Jan Reedyなどによって寄稿されました。)
IDLEエディタウィンドウのオプションの行番号を追加しました。 構成ダイアログの「一般」タブで特に設定されていない限り、ウィンドウは行番号なしで開きます。 既存のウィンドウの行番号は、[オプション]メニューに表示および非表示になります。 (:issue: `17535` でTalEinatとSaimadhavHeblikarによって寄稿されました。)
Python文字列とTclオブジェクト間の変換にOSネイティブエンコーディングが使用されるようになりました。 これにより、IDLEは絵文字やその他の非BMP文字を処理できます。 これらの文字は、クリップボードに表示したり、クリップボードにコピーして貼り付けたりすることができます。 文字列をTclからPythonに変換したり、元に戻したりしても失敗することはありません。 (多くの人がこれに8年間取り組んできましたが、問題は:issue: `13153` のSerhiyStorchakaによって最終的に解決されました。)
3.8.1の新機能:
カーソルの点滅をオフに切り替えるオプションを追加します。 (:issue: `4603` のZackerySpytzによる寄稿。)
エスケープキーは、IDLE完了ウィンドウを閉じるようになりました。 (:issue: `38944` でJohnnyNajeraによって寄稿されました。)
上記の変更は、3.7メンテナンスリリースにバックポートされています。
モジュール名補完リストにキーワードを追加します。 (TerryJによる寄稿。 のReedy:issue: `37765` 。)
検査する
inspect.getdoc()関数は、その属性が dict であり、値がdocstringである場合、__slots__
のdocstringを検索できるようになりました。 これにより、 property()、 classmethod()、および staticmethod()にすでにあるものと同様のドキュメントオプションが提供されます。
class AudioClip:
__slots__ = {'bit_rate': 'expressed in kilohertz to one decimal place',
'duration': 'in seconds, rounded up to an integer'}
def __init__(self, bit_rate, duration):
self.bit_rate = round(bit_rate / 1000.0, 1)
self.duration = ceil(duration)
(:issue: `36326` でRaymondHettingerによって寄稿されました。)
io
開発モード( -X env
)およびデバッグビルドでは、close()
メソッドが失敗した場合、 io.IOBase ファイナライザーが例外をログに記録するようになりました。 リリースビルドでは、デフォルトで例外はサイレントに無視されます。 (:issue: `18748` でVictorStinnerによって寄稿されました。)
itertools
itertools.accumulate()関数は、初期値を指定するためのオプション initial キーワード引数を追加しました。
>>> from itertools import accumulate
>>> list(accumulate([10, 5, 30, 15], initial=1000))
[1000, 1010, 1015, 1045, 1060]
(:issue: `34659` でLisaRoachによって寄稿されました。)
json.tool
オプション--json-lines
を追加して、すべての入力行を個別のJSONオブジェクトとして解析します。 (:issue: `31553` でWeipengHongによって寄稿されました。)
ロギング
force キーワード引数を logging.basicConfig()に追加しました。trueに設定すると、ルートロガーに接続されている既存のハンドラーが削除されて閉じられてから、他の引数で指定された構成が実行されます。 。
これは長年の問題を解決します。 ロガーまたは basicConfig()が呼び出されると、その後の basicConfig()の呼び出しは黙って無視されました。 これにより、インタラクティブプロンプトまたはJupyterノートブックを使用して、さまざまなログ設定オプションを更新、実験、または教えることが困難になりました。
(Raymond Hettingerによって提案され、Dong-hee Naによって実装され、:issue: `33897` でVinaySajipによってレビューされました。)
算数
2点間のユークリッド距離を計算するための新しい関数 math.dist()が追加されました。 (:issue: `33089` でRaymondHettingerによって寄稿されました。)
math.hypot()関数を拡張して、複数の次元を処理できるようにしました。 以前は、2Dの場合のみサポートされていました。 (:issue: `33089` でRaymondHettingerによって寄稿されました。)
sum()に類似した関数として、新しい関数 math.prod()を追加しました。この関数は、「開始」値(デフォルト:1)と反復可能な数値の積を返します。
>>> prior = 0.8
>>> likelihoods = [0.625, 0.84, 0.30]
>>> math.prod(likelihoods, start=prior)
0.126
(:issue: `35606` のPabloGalindoによる寄稿。)
2つの新しい組み合わせ関数 math.perm()と math.comb()を追加しました。
>>> math.perm(10, 3) # Permutations of 10 things taken 3 at a time
720
>>> math.comb(10, 3) # Combinations of 10 things taken 3 at a time
120
(:issue: `37128` 、:issue:` 37178` 、および:issue: `でYash Aggarwal、Keller Fuchs、Serhiy Storchaka、およびRaymondHettingerによって寄稿されました。 35431` 。)
浮動小数点に変換せずに正確な整数平方根を計算するための新しい関数 math.isqrt()が追加されました。 新しい関数は、任意の大きさの整数をサポートします。 floor(sqrt(n))
よりは高速ですが、 math.sqrt()よりは低速です。
>>> r = 650320427
>>> s = r ** 2
>>> isqrt(s - 1) # correct
650320426
>>> floor(sqrt(s - 1)) # incorrect
650320427
(:issue: `36887` でMarkDickinsonによって寄稿されました。)
関数 math.factorial()は、intに似ていない引数を受け入れなくなりました。 (:issue: `33083` のPabloGalindoによる寄稿。)
mmap
mmap.mmap クラスに、madvise()
システムコールにアクセスするための madvise()メソッドが追加されました。 (:issue: `32941` のZackerySpytzによる寄稿。)
マルチプロセッシング
新しい multiprocessing.shared_memory モジュールが追加されました。 (:issue: `35813` のDavinPottsによる寄稿。)
macOSでは、 spawn startメソッドがデフォルトで使用されるようになりました。 (:issue: `33725` でVictorStinnerによって寄稿されました。)
os
拡張モジュールをインポートするとき、または ctypes を使用してDLLをロードするときに、ネイティブ依存関係の追加の検索パスを提供するために、Windowsに新しい関数 add_dll_directory()を追加しました。 (:issue: `36085` でSteveDowerによって寄稿されました。)
memfd_create()
システムコールをラップするために、新しい os.memfd_create()関数が追加されました。 (:issue: `26836` でZackerySpytzとChristianHeimesによって寄稿されました。)
Windowsでは、再解析ポイント(シンボリックリンクやディレクトリジャンクションを含む)を処理するための手動ロジックの多くがオペレーティングシステムに委任されています。 具体的には、 os.stat()は、オペレーティングシステムでサポートされているものをすべてトラバースしますが、 os.lstat()は、「名前の代理」として識別される再解析ポイントのみを開きます。 os.stat()と同様に開きました。 いずれの場合も、stat_result.st_mode
にはシンボリックリンクにのみS_IFLNK
が設定され、他の種類の再解析ポイントには設定されません。 他の種類の再解析ポイントを特定するには、新しいstat_result.st_reparse_tag
属性を確認してください。
Windowsでは、 os.readlink()がディレクトリジャンクションを読み取ることができるようになりました。 islink()はディレクトリジャンクションに対してFalse
を返すため、最初にislink
をチェックするコードは引き続きジャンクションをディレクトリとして扱い、[からのエラーを処理するコードはX200X] os.readlink()は、ジャンクションをリンクとして扱うことができるようになりました。
(:issue: `37834` でSteveDowerによって寄稿されました。)
os.path
os.path 関数は exists()、 lexists()、 isdir()、 isfileのようなブール結果を返します()、 islink()、および ismount()は、 ValueError またはそのサブクラスを発生させる代わりに、False
を返すようになりました。 OSレベルで表現できない文字またはバイトを含むパスのUnicodeEncodeError および UnicodeDecodeError 。 (:issue: `33721` のSerhiyStorchakaによる寄稿。)
Windowsの expanduser()は、 USERPROFILE
環境変数を優先し、通常は設定されない HOME
を使用しなくなりました。通常のユーザーアカウントの場合。 (:issue: `36264` のAnthonySottileによる寄稿。)
Windowsの isdir()は、存在しないディレクトリへのリンクに対してTrue
を返さなくなりました。
Windowsの realpath()は、シンボリックリンクやディレクトリジャンクションなどの再解析ポイントを解決するようになりました。
(:issue: `37834` でSteveDowerによって寄稿されました。)
pathlib
pathlib.Path メソッドは exists()、 is_dir()、 is_file()、 is_mountのようなブール結果を返します()、 is_symlink()、 is_block_device()、 is_char_device()、 is_fifo()、 is_socket ()は、OSレベルで表現できない文字を含むパスに対して ValueError またはそのサブクラス UnicodeEncodeError を発生させる代わりに、False
を返すようになりました。 (:issue: `33721` のSerhiyStorchakaによる寄稿。)
パスを指すハードリンクを作成する pathlib.Path.link_to()を追加しました。 (:issue: `26978` のJoannahNanjekyeによる寄稿)
きゅうりのピクルス
C最適化 Pickler をサブクラス化する pickle 拡張機能は、特別な reducer_override()メソッドを定義することにより、関数とクラスのピクルスロジックをオーバーライドできるようになりました。 (:issue: `35900` でPierreGlaserとOlivierGriselによって寄稿されました。)
plistlib
新しい plistlib.UID が追加され、NSKeyedArchiverでエンコードされたバイナリplistの読み取りと書き込みのサポートが有効になりました。 (:issue: `26707` でJonJanzenによって寄稿されました。)
pprint
pprint モジュールは、 sort_dicts パラメーターをいくつかの関数に追加しました。 デフォルトでは、これらの関数はレンダリングまたは印刷の前に辞書をソートし続けます。 ただし、 sort_dicts がfalseに設定されている場合、ディクショナリはキーが挿入された順序を保持します。 これは、デバッグ中のJSON入力との比較に役立ちます。
さらに、便利な新関数 pprint.pp()があります。これは、 pprint.pprint()に似ていますが、 sort_dicts のデフォルトは [ X156X]:
>>> from pprint import pprint, pp
>>> d = dict(source='input.txt', operation='filter', destination='output.txt')
>>> pp(d, width=40) # Original order
{'source': 'input.txt',
'operation': 'filter',
'destination': 'output.txt'}
>>> pprint(d, width=40) # Keys sorted alphabetically
{'destination': 'output.txt',
'operation': 'filter',
'source': 'input.txt'}
(:issue: `30670` のRémiLapeyreによる寄稿。)
py_compile
py_compile.compile()はサイレントモードをサポートするようになりました。 (:issue: `22640` でJoannahNanjekyeによって寄稿されました。)
シャティル
shutil.copytree()は、新しいdirs_exist_ok
キーワード引数を受け入れるようになりました。 (:issue: `20849` でJoshBronsonによって寄稿されました。)
shutil.make_archive()は、 tarfile モジュールへの対応する変更から継承された、移植性と標準への準拠を改善するために、新しいアーカイブの最新のpax(POSIX.1-2001)形式にデフォルト設定されるようになりました。 。 (CAMによる寄稿 のGerlach:issue: `30661` 。)
Windowsの shutil.rmtree()は、最初に内容を再帰的に削除せずに、ディレクトリジャンクションを削除するようになりました。 (:issue: `37834` でSteveDowerによって寄稿されました。)
ソケット
create_server()および has_dualstack_ipv6()便利な関数を追加して、同じソケットでIPv4接続とIPv6接続の両方を受け入れるなど、サーバーソケットの作成時に通常必要なタスクを自動化します。 (:issue: `17561` のGiampaoloRodolàによる寄稿。)
socket.if_nameindex()、 socket.if_nametoindex()、および socket.if_indextoname()関数がWindowsに実装されました。 (:issue: `37007` のZackerySpytzによる寄稿。)
ssl
post_handshake_auth を追加して有効にし、 verify_client_post_handshake()を追加してTLS1.3ポストハンドシェイク認証を開始しました。 (:issue: `34670` のChristianHeimesによる寄稿。)
統計
statistics.mean()のより高速な浮動小数点バリアントとして、 statistics.fmean()を追加しました。 (:issue: `35904` でRaymondHettingerとStevenD'Apranoによって寄稿されました。)
statistics.geometric_mean()を追加しました(:issue: `27181` のRaymondHettingerによる寄稿)。
最も一般的な値のリストを返す statistics.multimode()を追加しました。 (:issue: `35892` でRaymondHettingerによって寄稿されました。)
データまたは分布を等確率間隔に分割する statistics.quantiles()を追加しました(例: 四分位数、十分位数、またはパーセンタイル)。 (:issue: `36546` でRaymondHettingerによって寄稿されました。)
statistics.NormalDist を追加しました。これは、確率変数の正規分布を作成および操作するためのツールです。 (:issue: `36018` でRaymondHettingerによって寄稿されました。)
>>> temperature_feb = NormalDist.from_samples([4, 12, -3, 2, 7, 14])
>>> temperature_feb.mean
6.0
>>> temperature_feb.stdev
6.356099432828281
>>> temperature_feb.cdf(3) # Chance of being under 3 degrees
0.3184678262814532
>>> # Relative chance of being 7 degrees versus 10 degrees
>>> temperature_feb.pdf(7) / temperature_feb.pdf(10)
1.2039930378537762
>>> el_niño = NormalDist(4, 2.5)
>>> temperature_feb += el_niño # Add in a climate effect
>>> temperature_feb
NormalDist(mu=10.0, sigma=6.830080526611674)
>>> temperature_feb * (9/5) + 32 # Convert to Fahrenheit
NormalDist(mu=50.0, sigma=12.294144947901014)
>>> temperature_feb.samples(3) # Generate random samples
[7.672102882379219, 12.000027119750287, 4.647488369766392]
sys
新しい sys.unraisablehook()関数を追加します。この関数をオーバーライドして、「発生しない例外」の処理方法を制御できます。 例外が発生したときに呼び出されますが、Pythonがそれを処理する方法はありません。 たとえば、デストラクタが例外を発生させたとき、またはガベージコレクション中に( gc.collect())。 (:issue: `36829` でVictorStinnerによって寄稿されました。)
tarfile
tarfile モジュールは、以前のGNU固有のアーカイブではなく、デフォルトで新しいアーカイブの最新のpax(POSIX.1-2001)形式になりました。 これにより、標準化された拡張可能な形式の一貫したエンコーディング(UTF-8)により、クロスプラットフォームの移植性が向上し、他にもいくつかの利点があります。 (CAMによる寄稿 のGerlach:issue: `36268` 。)
糸脱毛
キャッチされない threading.Thread.run()例外を処理する新しい threading.excepthook()関数を追加します。 キャッチされない threading.Thread.run()例外の処理方法を制御するためにオーバーライドできます。 (:issue: `1230540` でVictorStinnerによって寄稿されました。)
新しい threading.get_native_id()関数と native_id 属性を threading.Thread クラスに追加します。 これらは、カーネルによって割り当てられた現在のスレッドのネイティブの整数スレッドIDを返します。 この機能は特定のプラットフォームでのみ使用できます。詳細については、 get_native_id を参照してください。 (:issue: `36084` でJakeTeslerによって寄稿されました。)
トークン化
tokenize モジュールは、末尾に改行がない入力が提供されたときに、NEWLINE
トークンを暗黙的に発行するようになりました。 この動作は、Cトークナイザーが内部で行う動作と一致するようになりました。 (:issue: `33899` でAmmarAskarによって寄稿されました。)
tkinter
tkinter.Spinbox
クラスにメソッドselection_from()
、selection_present()
、selection_range()
、selection_to()
を追加しました。 (:issue: `34829` でJulietteMonselによって寄稿されました。)
tkinter.Canvas
クラスにメソッドmoveto()
を追加しました。 (:issue: `23831` でJulietteMonselによって寄稿されました。)
tkinter.PhotoImage
クラスにtransparency_get()
メソッドとtransparency_set()
メソッドが追加されました。 (:issue: `25451` のZackerySpytzによる寄稿。)
タイピング
タイピングモジュールには、いくつかの新機能が組み込まれています。
キーごとのタイプを持つ辞書タイプ。 PEP 589 および typing.TypedDict を参照してください。 TypedDictは文字列キーのみを使用します。 デフォルトでは、すべてのキーが存在する必要があります。 キーをオプションにするには、「total = False」を指定します。
class Location(TypedDict, total=False): lat_long: tuple grid_square: str xy_coordinate: tuple
リテラルタイプ。 PEP 586 および typing.Literal を参照してください。 リテラルタイプは、パラメータまたは戻り値が1つ以上の特定のリテラル値に制約されていることを示します。
def get_status(port: int) -> Literal['connected', 'disconnected']: ...
「最終的な」変数、関数、メソッド、およびクラス。 PEP 591 、 typing.Final および typing.final()を参照してください。 最後の修飾子は、静的型チェッカーにサブクラス化、オーバーライド、または再割り当てを制限するように指示します。
pi: Final[float] = 3.1415926536
プロトコル定義。 PEP 544 、 typing.Protocol および typing.runtime_checkable()を参照してください。 typing.SupportsInt のような単純なABCが
Protocol
サブクラスになりました。新しいプロトコルクラス typing.SupportsIndex 。
新しい関数 typing.get_origin()および typing.get_args()。
unicodedata
unicodedata モジュールは、 Unicode 12.1.0 リリースを使用するようにアップグレードされました。
新しい関数 is_normalized()を使用して、文字列が特定の正規形であることを確認できます。多くの場合、実際に文字列を正規化するよりもはるかに高速です。 (:issue: `32285` および:issue:` 37966` のMaxBelanger、David Euresti、およびGreg Priceによる寄稿)。
単体テスト
Mock の非同期バージョンをサポートするために、 AsyncMock が追加されました。 テスト用の適切な新しいアサート関数も追加されました。 (:issue: `26467` のLisaRoachによる寄稿)。
addModuleCleanup()および addClassCleanup()をユニットテストに追加して、setUpModule()
および setUpClass()のクリーンアップをサポートします。 (:issue: `24412` でLisaRoachによって寄稿されました。)
いくつかのモックアサート関数は、失敗時に実際の呼び出しのリストも出力するようになりました。 (:issue: `35047` のPetterStrandmarkによる寄稿。)
unittest モジュールは、 unittest.IsolatedAsyncioTestCase でテストケースとして使用されるコルーチンのサポートを取得しました。 (:issue: `32972` でAndrewSvetlovによって寄稿されました。)
例:
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()
venv
venv には、PowerShell Core6.1で仮想環境をアクティブ化するためのActivate.ps1
スクリプトがすべてのプラットフォームに含まれるようになりました。 (:issue: `32718` のBrettCannonによる寄稿。)
weakref
weakref.proxy()によって返されるプロキシオブジェクトは、他の数値演算子に加えて、行列乗算演算子@
および@=
をサポートするようになりました。 (:issue: `36669` でMarkDickinsonによって寄稿されました。)
xml
DTDおよび外部エンティティの取得に対する緩和策として、 xml.dom.minidom および xml.sax モジュールはデフォルトで外部エンティティを処理しなくなりました。 (:issue: `17239` でChristianHeimesによって寄稿されました。)
xml.etree.ElementTree モジュールの.find*()
メソッドは、名前空間を無視する{*}tag
や指定されたすべてのタグを返す{namespace}*
などのワイルドカード検索をサポートします。名前空間。 (:issue: `28238` でStefanBehnelによって寄稿されました。)
xml.etree.ElementTree モジュールは、C14N2.0を実装する新しい関数–xml.etree.ElementTree.canonicalize()
を提供します。 (:issue: `13611` でStefanBehnelによって寄稿されました。)
xml.etree.ElementTree.XMLParser のターゲットオブジェクトは、新しいコールバックメソッドstart_ns()
およびend_ns()
を介して名前空間宣言イベントを受信できます。 さらに、 xml.etree.ElementTree.TreeBuilder ターゲットは、コメントに関するイベントと処理命令を処理して、生成されたツリーにそれらを含めるように構成できます。 (:issue: `36676` および:issue:` 36673` でStefanBehnelによって寄稿されました。)
xmlrpc
xmlrpc.client.ServerProxy は、各リクエストで送信される一連のHTTPヘッダーに対してオプションの headers キーワード引数をサポートするようになりました。 特に、これにより、デフォルトの基本認証からより高速なセッション認証にアップグレードできます。 (:issue: `35153` のCédricKrierによる寄稿。)
最適化
サブプロセスモジュールは、パフォーマンスを向上させるために、 os.posix_spawn()関数を使用できるようになりました。 現在、次のすべての条件が満たされている場合にのみ、macOSおよびLinux(glibc 2.24以降を使用)で使用されます。
close_fds はfalseです。
preexec_fn 、 pass_fds 、 cwd 、および start_new_session パラメーターが設定されていません。
実行可能パスにはディレクトリが含まれています。
(:issue: `35537` でJoannahNanjekyeとVictorStinnerによって寄稿されました。)
shutil.copyfile()、 shutil.copy()、 shutil.copy2()、 shutil.copytree()、[X108X ] shutil.move()は、ファイルをより効率的にコピーするために、LinuxおよびmacOSでプラットフォーム固有の「高速コピー」システムコールを使用します。 「高速コピー」とは、「
outfd.write(infd.read())
」のようにPythonでユーザースペースバッファーを使用せずに、カーネル内でコピー操作が行われることを意味します。 Windowsでは、 shutil.copyfile()は、より大きなデフォルトのバッファーサイズ(16KiBではなく1MiB)と memoryview()ベースの shutil.copyfileobj()のバリアントを使用します。 を使用します。 同じパーティション内で512MiBファイルをコピーする場合のスピードアップは、約+26 % o n Linux、+ 50 % o n macOS、および+40 % o nWindowsです。 また、消費されるCPUサイクルもはるかに少なくなります。 プラットフォームに依存する効率的なコピー操作セクションを参照してください。 (:issue: `33671` のGiampaoloRodolàによる寄稿。)shutil.copytree()は os.scandir()関数を使用し、それに依存するすべてのコピー関数はキャッシュされた os.stat()値を使用します。 8000ファイルのディレクトリをコピーするためのスピードアップは、約+9 % o n Linux、+ 20 % o n Windows、および+30 % o na WindowsSMB共有です。 また、 os.stat()システムコールの数が38%削減され、ネットワークファイルシステムで shutil.copytree()が特に高速になります。 (:issue: `33695` のGiampaoloRodolàによる寄稿。)
pickle モジュールのデフォルトのプロトコルは、Python3.4で最初に導入されたプロトコル4になりました。 Python 3.0以降で利用可能なプロトコル3と比較して、パフォーマンスが向上し、サイズが小さくなります。
PyGC_Head
からPy_ssize_t
メンバーを1つ削除しました。 すべてのGC追跡オブジェクト(例: タプル、リスト、dict)サイズが4バイトまたは8バイト縮小されます。 (:issue: `33597` で稲田直樹によって寄稿されました。)uuid.UUID は、
__slots__
を使用してメモリフットプリントを削減するようになりました。 (:issue: `30977` のWouterBolsterleeとTalEinatによる寄稿)operator.itemgetter()のパフォーマンスが33%向上しました。 引数処理を最適化し、単一の非負の整数インデックスの一般的なケースの高速パスをタプルに追加しました(これは標準ライブラリの一般的なユースケースです)。 (:issue: `35664` でRaymondHettingerによって寄稿されました。)
collections.namedtuple()での高速化されたフィールドルックアップ。 これらは現在2倍以上高速であり、Pythonでのインスタンス変数ルックアップの最速の形式になっています。 (Raymond Hettinger、Pablo Galindo、Joe Jevnik、Serhiy Storchakaによる:issue: `32492` の寄稿。)
list コンストラクターは、入力iterableの長さが既知の場合(入力は
__len__
を実装します)、内部アイテムバッファーを過剰に割り当てません。 これにより、作成されたリストは平均で12 % sマラーになります。 (:issue: `33234` でRaymondHettingerとPabloGalindoによって寄稿されました。)クラス変数の書き込み速度が2倍になりました。 dunder以外の属性が更新されたときに、スロットを更新するための不要な呼び出しがありました。 (:issue: `36012` で、Stefan Behnel、Pablo Galindo Salgado、Raymond Hettinger、Neil Schemenauer、およびSerhiy Storchakaによって寄稿されました。)
多くの組み込み関数およびメソッドに渡される引数を変換するオーバーヘッドを削減しました。 これにより、いくつかの単純な組み込み関数とメソッドの呼び出しが最大20〜50%高速化されました。 (:issue: `23867` 、:issue:` 35582` 、:issue: `36127` でSerhiyStorchakaによって寄稿されました。)
LOAD_GLOBAL
命令は、新しい「オペコードごとのキャッシュ」メカニズムを使用するようになりました。 今は約40 % fアスターです。 (:issue: `26219` でYurySelivanovとInadaNaokiによって寄稿されました。)
ビルドとCAPIの変更
デフォルトの sys.abiflags は空の文字列になりました:pymallocの
m
フラグは役に立たなくなりました(pymallocのあるビルドとないビルドはABI互換です)。 (:issue: `36707` でVictorStinnerによって寄稿されました。)変更例:
python3.8
プログラムのみがインストールされ、python3.8m
プログラムはなくなりました。python3.8-config
スクリプトのみがインストールされ、python3.8m-config
スクリプトはなくなりました。m
フラグは、ダイナミックライブラリファイル名のサフィックスから削除されました。標準ライブラリの拡張モジュールと、PyPIからダウンロードされたものなどのサードパーティパッケージによって生成およびインストールされたものです。 たとえば、Linuxでは、Python3.7のサフィックス.cpython-37m-x86_64-linux-gnu.so
はPython3.8では.cpython-38-x86_64-linux-gnu.so
になりました。
ヘッダーファイルは、さまざまな種類のAPIをより適切に分離するために再編成されました。
Include/*.h
は、ポータブルなパブリック安定CAPIである必要があります。Include/cpython/*.h
は、CPythonに固有の不安定なCAPIである必要があります。 パブリックAPI。一部のプライベートAPIの前に_Py
または_PY
が付いています。Include/internal/*.h
は、CPythonに非常に固有のプライベート内部CAPIです。 このAPIには下位互換性の保証がないため、CPythonの外部で使用しないでください。 これは、関数を呼び出さずにCPython内部にアクセスする必要があるデバッガーやプロファイルなどの非常に特定のニーズに対してのみ公開されます。 このAPIは、make install
によってインストールされるようになりました。
(:issue: `35134` および:issue:` 35081` でVictorStinnerによって寄稿されました。この作業は、Python3.7でEricSnowによって開始されました。)
一部のマクロは静的インライン関数に変換されています。パラメーター型と戻り型は明確に定義されており、マクロに固有の問題はなく、変数にはローカルスコープがあります。 例:
PyObject_INIT()
、PyObject_INIT_VAR()
プライベート機能:
_PyObject_GC_TRACK()
、_PyObject_GC_UNTRACK()
、_Py_Dealloc()
(:issue: `35059` でVictorStinnerによって寄稿されました。)
PyByteArray_Init()
およびPyByteArray_Fini()
機能は削除されました。 Python2.7.4およびPython3.2.0以降は何もせず、制限付きAPI(安定したABI)から除外され、文書化されていませんでした。 (:issue: `35713` でVictorStinnerによって寄稿されました。)PyExceptionClass_Name()
の結果は、char *
ではなくconst char *
タイプになりました。 (:issue: `33818` でSerhiyStorchakaによって寄稿されました。)Modules/Setup.dist
とModules/Setup
の二重性は削除されました。 以前は、CPythonソースツリーを更新するときに、アップストリームの変更を反映するために、Modules/Setup.dist
(ソースツリー内)をModules/Setup
(ビルドツリー内)に手動でコピーする必要がありました。 これは、ファイルのコピーを忘れるとビルドが失敗する可能性があるため、CPython開発後の開発者に頻繁に迷惑をかけることを犠牲にして、パッケージャーにとっては小さなメリットでした。これで、ビルドシステムは常にソースツリー内の
Modules/Setup
から読み取ります。 そのファイルをカスタマイズしたい人は、ソースツリーへの他の変更の場合と同様に、CPythonのgitフォークまたはパッチファイルとして変更を維持することをお勧めします。(:issue: `32430` のAntoinePitrouによる寄稿。)
Python番号を PyLong_AsLong()のようなC整数に変換する関数、および PyArg_ParseTuple()のような引数解析関数と
'i'
のような整数変換形式の単位がを使用するようになりました。利用可能な場合、 __ int __()の代わりに] __ index __()特別なメソッド。 非推奨の警告は、__int__()
メソッドを使用しているが、__index__()
メソッドを使用していないオブジェクト( Decimal や Fraction など)に対して発行されます。 PyNumber_Check()は、__index__()
を実装するオブジェクトに対して1
を返すようになりました。 PyNumber_Long()、 PyNumber_Float()、および PyFloat_AsDouble()も、使用可能な場合は__index__()
メソッドを使用するようになりました。 (:issue: `36048` および:issue:` 20092` でSerhiyStorchakaによって寄稿されました。)ヒープに割り当てられた型オブジェクトは、 PyType_GenericAlloc()ではなく、 PyObject_Init()(およびその並列マクロ
PyObject_INIT
)で参照カウントを増やすようになりました。 インスタンスの割り当てまたは割り当て解除を変更するタイプは、調整が必要な場合があります。 (:issue: `35810` でEddieElizondoによって寄稿されました。)新しい関数 PyCode_NewWithPosOnlyArgs()を使用すると、 PyCode_New()のようなコードオブジェクトを作成できますが、位置のみの引数の数を示すための追加の posonlyargcount パラメーターがあります。 (:issue: `37221` のPabloGalindoによる寄稿。)
Py_SetPath()は、 sys.executable をプログラム名( Py_GetProgramName()[ X171X])。 (:issue: `38234` でVictorStinnerによって寄稿されました。)
非推奨
distutils
bdist_wininst
コマンドは非推奨になりました。代わりに、bdist_wheel
(ホイールパッケージ)を使用してください。 (:issue: `37481` でVictorStinnerによって寄稿されました。)ElementTree モジュールの非推奨メソッド
getchildren()
およびgetiterator()
は、 PendingDeprecationWarning ではなく DeprecationWarning を発行するようになりました。 これらはPython3.9で削除されます。 (:issue: `29209` でSerhiyStorchakaによって寄稿されました。)concurrent.futures.ThreadPoolExecutor のインスタンスではないオブジェクトを loop.set_default_executor()に渡すことは非推奨であり、Python3.9では禁止されています。 (:issue: `34075` でElvisPranskevichusによって寄稿されました。)
xml.dom.pulldom.DOMEventStream 、 wsgiref.util.FileWrapper 、および fileinput.FileInput の
__getitem__()
メソッドは非推奨になりました。これらのメソッドの実装は、 index パラメーターを無視し、代わりに次の項目を返してきました。 (:issue: `9372` のBerkerPeksagによる寄稿。)
typing.NamedTuple クラスは、同じ情報を持つ
__annotations__
属性を優先して、_field_types
属性を非推奨にしました。 (:issue: `36320` でRaymondHettingerによって寄稿されました。)ast クラス
Num
、Str
、Bytes
、NameConstant
、Ellipsis
は非推奨と見なされ、将来のPythonバージョン。 代わりにConstant
を使用する必要があります。 (:issue: `32892` のSerhiyStorchakaによる寄稿。)ast.NodeVisitor メソッド
visit_Num()
、visit_Str()
、visit_Bytes()
、visit_NameConstant()
、visit_Ellipsis()
は廃止され、今後も廃止される予定です。将来のPythonバージョンで呼び出されます。visit_Constant()
メソッドを追加して、すべての定数ノードを処理します。 (:issue: `36917` でSerhiyStorchakaによって寄稿されました。)asyncio.coroutine() デコレータは非推奨であり、バージョン3.10で削除されます。
@asyncio.coroutine
の代わりに、 async def を使用してください。 (:issue: `36921` でAndrewSvetlovによって寄稿されました。)asyncio では、 loop 引数の明示的な受け渡しは非推奨であり、バージョン3.10では
asyncio.sleep()
、asyncio.gather()
、asyncio.shield()
、asyncio.wait_for()
、asyncio.wait()
、 asyncio.as_completed()、 asyncio.Task 、 asyncio.Lock [ X272X]、 asyncio.Event 、 asyncio.Condition 、 asyncio.Semaphore 、 asyncio.BoundedSemaphore 、 asyncio.Queue [ X420X]、asyncio.create_subprocess_exec()
、およびasyncio.create_subprocess_shell()
。asyncio.wait()
へのコルーチンオブジェクトの明示的な受け渡しは非推奨になり、バージョン3.11で削除される予定です。 (:issue: `34790` でYurySelivanovによって寄稿されました。)次の関数とメソッドは、 gettext モジュールで非推奨になりました: lgettext()、 ldgettext()、 lngettext()、[X151X ] ldngettext()。 これらはエンコードされたバイトを返します。変換された文字列にエンコードの問題がある場合、予期しないUnicode関連の例外が発生する可能性があります。 Python3でUnicode文字列を返す代替手段を使用することをお勧めします。 これらの機能は長い間壊れていました。
関数 bind_textdomain_codeset()、メソッド output_charset()および set_output_charset()、および関数 translation()の codeset パラメーターおよび install()も、
l*gettext()
関数にのみ使用されるため、非推奨になりました。 (:issue: `33710` のSerhiyStorchakaによる寄稿。)threading.Thread の
isAlive()
メソッドは非推奨になりました。 (:issue: `35283` のDong-hee Naによる寄稿。)整数引数をとる多くの組み込み関数と拡張関数は、 Decimal 、 Fraction 、および損失がある場合にのみ整数に変換できるその他のオブジェクトに対して非推奨の警告を発するようになりました(例: __ int __()メソッドはありますが、 __ index __()メソッドはありません)。 将来のバージョンでは、それらはエラーになります。 (:issue: `36048` でSerhiyStorchakaによって寄稿されました。)
次の引数をキーワード引数として渡すことは非推奨です。
func in functools.partialmethod()、 weakref.finalize()、 profile.Profile.runcall()、 [ X122X]、 bdb.Bdb.runcall()、 trace.Trace.runfunc()および curses.wrapper()。
concurrent.futures.ThreadPoolExecutor および concurrent.futures.ProcessPoolExecutor の submit()メソッドの fn 。
contextlib.ExitStack.callback()、
contextlib.AsyncExitStack.callback()
、および contextlib.AsyncExitStack.push_async_callback()の callback 。multiprocessing.managers.Server
およびmultiprocessing.managers.SharedMemoryServer
のcreate()
メソッドの c および typeid 。weakref.finalize()の obj 。
Pythonの将来のリリースでは、位置のみになります。 (:issue: `36492` のSerhiyStorchakaによる寄稿。)
APIと機能の削除
次の機能とAPIがPython3.8から削除されました。
- Python 3.3以降、 collections からのABCのインポートは非推奨になり、インポートは collections.abc から実行する必要があります。 コレクションからインポートできるようになることは、3.8で削除のマークが付けられましたが、3.9に延期されました。 (:issue: `36952` を参照してください。)
- Python3.7で非推奨となった
macpath
モジュールは削除されました。 (:issue: `35471` でVictorStinnerによって寄稿されました。) - 関数
platform.popen()
は、Python 3.3以降非推奨になった後、削除されました。代わりに os.popen()を使用してください。 (:issue: `35345` でVictorStinnerによって寄稿されました。) - 関数
time.clock()
は、Python 3.3以降非推奨になった後、削除されました。要件に応じて、代わりに time.perf_counter()または time.process_time()を使用してください。 、明確に定義された動作をする。 (:issue: `36895` でMatthiasBussonnierによって寄稿されました。) pyvenv
スクリプトは削除され、python3.8 -m venv
が優先され、pyvenv
スクリプトがどのPythonインタープリターに関連付けられているかに関する混乱をなくすことができます。 (:issue: `25427` のBrettCannonによる寄稿。)parse_qs
、parse_qsl
、およびescape
は、 cgi モジュールから削除されます。 これらはPython3.2以前では非推奨です。 代わりに、urllib.parse
およびhtml
モジュールからインポートする必要があります。filemode
関数が tarfile モジュールから削除されました。 Python 3.3以降、文書化および非推奨にはなりません。- XMLParser コンストラクターは、 html 引数を受け入れなくなりました。 効果はなく、Python3.4では非推奨になりました。 他のすべてのパラメータはキーワードのみになりました。 (:issue: `29209` でSerhiyStorchakaによって寄稿されました。)
- XMLParser の
doctype()
メソッドを削除しました。 (:issue: `29209` でSerhiyStorchakaによって寄稿されました。) - 「unicode_internal」コーデックが削除されました。 (:issue: `36297` で稲田直樹によって寄稿されました。)
- sqlite3 モジュールの
Cache
およびStatement
オブジェクトはユーザーに公開されません。 (:issue: `30262` でAvivPalivodaによって寄稿されました。) - fileinput.input()および fileinput.FileInput()の
bufsize
キーワード引数は無視され、Python3.6が削除されたため非推奨になりました。 :issue: `36952` (Matthias Bussonnierによる寄稿) - Python3.7で非推奨になった関数
sys.set_coroutine_wrapper()
およびsys.get_coroutine_wrapper()
は削除されました。 :issue: `36933` (Matthias Bussonnierによる寄稿)
Python3.8への移植
このセクションでは、コードの変更が必要になる可能性のある、前述の変更とその他のバグ修正を示します。
Pythonの動作の変更
- 歩留まり式(
yield
句とyield from
句の両方)は、内包表記とジェネレータ式では許可されなくなりました(左端のfor
句の反復可能な式を除く)。 (:issue: `10544` のSerhiyStorchakaによる寄稿。) - コンパイラは、IDチェック(
is
およびis not
)が特定のタイプのリテラル(例: 文字列、数字)。 これらはCPythonで偶然に機能することがよくありますが、言語仕様によって保証されていません。 警告は、代わりに同等性テスト(==
および!=
)を使用するようにユーザーにアドバイスします。 (:issue: `34850` のSerhiyStorchakaによる寄稿。) - CPythonインタープリターは、状況によっては例外を飲み込む可能性があります。 Python 3.8では、これが発生するケースは少なくなります。 特に、タイプディクショナリから属性を取得するときに発生した例外は無視されなくなりました。 (:issue: `35459` のSerhiyStorchakaによる寄稿。)
- 組み込み型 bool 、 int 、 float 、 complex から
__str__
実装を削除し、標準ライブラリからいくつかのクラスを削除しました。 オブジェクトから__str__()
を継承するようになりました。 その結果、これらのクラスのサブクラスで__repr__()
メソッドを定義すると、文字列表現に影響します。 (:issue: `36793` のSerhiyStorchakaによる寄稿。) - AIXでは、 sys.platform にメジャーバージョンが含まれなくなりました。
'aix3'
ではなく、常に'aix'
です。'aix7'
。 古いPythonバージョンにはバージョン番号が含まれているため、常にsys.platform.startswith('aix')
を使用することをお勧めします。 (Mによる寄稿。 :issue: `36588` で感じました。) - PyEval_AcquireLock()および PyEval_AcquireThread()は、インタープリターのファイナライズ中に呼び出された場合に現在のスレッドを終了するようになり、 PyEval_RestoreThread()、 Py_END_ALLOW_THSと整合性が保たれます。 ()、および PyGILState_Ensure()。 この動作が望ましくない場合は、
_Py_IsFinalizing()
またはsys.is_finalizing()
をチェックして通話を保護してください。 (:issue: `36475` でJoannahNanjekyeによって寄稿されました。)
PythonAPIの変更
- os.getcwdb()関数は、ANSIコードページではなく、WindowsでUTF-8エンコーディングを使用するようになりました。理論的根拠については PEP 529 を参照してください。 この関数は、Windowsでは非推奨ではなくなりました。 (:issue: `37412` でVictorStinnerによって寄稿されました。)
- subprocess.Popen は、パフォーマンスを向上させるために、場合によっては os.posix_spawn()を使用できるようになりました。 Windows Subsystem for LinuxおよびQEMUユーザーエミュレーションで、 os.posix_spawn()を使用する
Popen
コンストラクターで、「プログラムがありません」などのエラーで例外が発生しなくなりました。 代わりに、子プロセスはゼロ以外のreturncode
で失敗します。 (:issue: `35537` でJoannahNanjekyeとVictorStinnerによって寄稿されました。) - * subprocess.Popen の preexec_fn 引数はサブインタープリターと互換性がなくなりました。 サブインタープリターでパラメーターを使用すると、 RuntimeError が発生するようになりました。 (:issue: `34651` のEricSnowによる寄稿、:issue:` 37951` のChristianHeimesによる変更)
imap.IMAP4.logout()
メソッドは、任意の例外をサイレントに無視しなくなりました。 (:issue: `36348` でVictorStinnerによって寄稿されました。)- 関数
platform.popen()
は、Python 3.3以降非推奨になった後、削除されました。代わりに os.popen()を使用してください。 (:issue: `35345` でVictorStinnerによって寄稿されました。) - statistics.mode()関数は、マルチモーダルデータが与えられたときに例外を発生させなくなりました。 代わりに、入力データで検出された最初のモードを返します。 (:issue: `35892` でRaymondHettingerによって寄稿されました。)
- tkinter.ttk.Treeview クラスの selection()メソッドは引数を取りません。 選択を変更するための引数と一緒に使用することは、Python3.6では非推奨になりました。 選択を変更するには、 selection_set()などの特殊なメソッドを使用します。 (:issue: `31508` のSerhiyStorchakaによる寄稿。)
- xml.dom.minidom の
writexml()
、toxml()
、toprettyxml()
メソッド、およびxml.etree
のwrite()
メソッド]、ユーザーが指定した属性の順序を保持するようになりました。 (:issue: `34160` でDiegoRojasとRaymondHettingerによって寄稿されました。) - フラグ
'r'
で開かれた dbm.dumb データベースが読み取り専用になりました。 フラグ'r'
および'w'
を持つ dbm.dumb.open()は、データベースが存在しない場合、データベースを作成しなくなりました。 (:issue: `32749` のSerhiyStorchakaによる寄稿。) - XMLParser のサブクラスで定義された
doctype()
メソッドは呼び出されなくなり、 DeprecationWarning の代わりに RuntimeWarning を発行します。 XML doctype宣言を処理するために、ターゲットで doctype()メソッドを定義します。 (:issue: `29209` でSerhiyStorchakaによって寄稿されました。) - カスタムメタクラスが
type.__new__
に渡された名前空間に__classcell__
エントリを提供しない場合、 RuntimeError が発生するようになりました。 DeprecationWarning がPython3.6–3.7で発行されました。 (:issue: `23722` のSerhiyStorchakaによる寄稿。) cProfile.Profile
クラスをコンテキストマネージャーとして使用できるようになりました。 (:issue: `29235` でScottSandersonによって寄稿されました。)- shutil.copyfile()、 shutil.copy()、 shutil.copy2()、 shutil.copytree()、[X108X ] shutil.move()は、プラットフォーム固有の「高速コピー」システムコールを使用します(プラットフォームに依存する効率的なコピー操作セクションを参照)。
- shutil.copyfile() Windowsのデフォルトのバッファサイズが16KiBから1MiBに変更されました。
PyGC_Head
構造体が完全に変更されました。 構造体メンバーに触れたすべてのコードを書き直す必要があります。 (:issue: `33597` を参照してください。)- PyInterpreterState 構造体は、「内部」ヘッダーファイル(具体的にはInclude / internal / pycore_pystate.h)に移動されました。 不透明な
PyInterpreterState
は、パブリックAPI(および安定したABI)の一部として引き続き使用できます。 ドキュメントには、構造体のフィールドはどれも公開されていないことが示されているため、誰もそれらを使用していないことを願っています。 ただし、これらのプライベートフィールドの1つ以上に依存していて、代替手段がない場合は、BPOの問題を開いてください。 調整のお手伝いをします(おそらく、パブリックAPIへのアクセサー関数の追加を含みます)。 (:issue: `35886` を参照してください。) - mmap.flush()メソッドは、成功すると
None
を返し、すべてのプラットフォームでエラー時に例外を発生させるようになりました。 以前は、その動作はプラットフォームに依存していました。成功するとゼロ以外の値が返されました。 Windowsでエラーが発生すると、ゼロが返されました。 成功するとゼロ値が返されました。 Unixでのエラー時に例外が発生しました。 (:issue: `2122` のBerkerPeksagによる寄稿。) - xml.dom.minidom および xml.sax モジュールは、デフォルトで外部エンティティを処理しなくなりました。 (:issue: `17239` でChristianHeimesによって寄稿されました。)
- 読み取り専用の dbm データベース( dbm.dumb 、 dbm.gnu または dbm.ndbm )からキーを削除すると、[X120X KeyError の代わりに] ( dbm.dumb.error 、 dbm.gnu.error または dbm.ndbm.error ) 。 (:issue: `33106` のXiangZhangによる寄稿。)
- リテラルの簡略化されたAST。 すべての定数は
ast.Constant
インスタンスとして表されます。 古いクラスNum
、Str
、Bytes
、NameConstant
、およびEllipsis
をインスタンス化すると、Constant
のインスタンスが返されます。 (:issue: `32892` のSerhiyStorchakaによる寄稿。) - Windowsの expanduser()は、
USERPROFILE
環境変数を優先し、通常は設定されないHOME
を使用しなくなりました。通常のユーザーアカウントの場合。 (:issue: `36264` のAnthonySottileによる寄稿。) - 例外 asyncio.CancelledError は、 Exception ではなく BaseException から継承し、 concurrent.futures.CancelledError から継承しなくなりました。 (:issue: `32528` でYurySelivanovによって寄稿されました。)
- 関数
asyncio.wait_for()
は、 asyncio.Task のインスタンスを使用するときに、キャンセルを正しく待機するようになりました。 以前は、タイムアウトに達するとキャンセルされ、すぐに返されていました。 (:issue: `32751` でElvisPranskevichusによって寄稿されました。) - 関数 asyncio.BaseTransport.get_extra_info()は、 'socket'が name パラメーターに渡されたときに、安全に使用できるソケットオブジェクトを返すようになりました。 (:issue: `37027` でYurySelivanovによって寄稿されました。)
- asyncio.BufferedProtocol は安定したAPIに移行しました。
- 拡張モジュールおよびWindows上の ctypes でロードされたDLLのDLL依存関係は、より安全に解決されるようになりました。 システムパス、DLLまたはPYDファイルを含むディレクトリ、および add_dll_directory()で追加されたディレクトリのみが、ロード時の依存関係について検索されます。 具体的には、
PATH
と現在の作業ディレクトリは使用されなくなり、これらを変更しても通常のDLL解決には影響しなくなります。 アプリケーションがこれらのメカニズムに依存している場合は、 add_dll_directory()を確認し、存在する場合は、ライブラリのロード中にDLLディレクトリを追加するために使用する必要があります。 Windows 7ユーザーは、Windows Update KB2533623がインストールされていることを確認する必要があることに注意してください(これはインストーラーによっても確認されます)。 (:issue: `36085` でSteveDowerによって寄稿されました。) - pgenに関連するヘッダーファイルと関数は、純粋なPython実装に置き換えられた後に削除されました。 (:issue: `36623` のPabloGalindoによる寄稿。)
- types.CodeType には、コンストラクターの2番目の位置( posonlyargcount )に新しいパラメーターがあり、 PEP 570 で定義された位置のみの引数をサポートします。 ]。 最初の引数( argcount )は、位置引数(位置のみの引数を含む)の総数を表すようになりました。 types.CodeType の新しい
replace()
メソッドを使用して、コードを将来性のあるものにすることができます。
CAPIの変更
PyCompilerFlags 構造体に、新しい cf_feature_version フィールドが追加されました。
PY_MINOR_VERSION
に初期化する必要があります。 このフィールドはデフォルトでは無視され、PyCF_ONLY_AST
フラグが cf_flags に設定されている場合にのみ使用されます。 (:issue: `35766` でGuidovan Rossumによって寄稿されました。)PyEval_ReInitThreads()
関数はCAPIから削除されました。 明示的に呼び出すべきではありません。代わりに PyOS_AfterFork_Child()を使用してください。 (:issue: `36728` でVictorStinnerによって寄稿されました。)Unixでは、AndroidとCygwinを除いて、C拡張機能はlibpythonにリンクされなくなりました。 Pythonが組み込まれている場合、
libpython
にはRTLD_LOCAL
をロードするのではなく、RTLD_GLOBAL
をロードする必要があります。 以前は、RTLD_LOCAL
を使用して、*shared*
セクションによって構築された標準ライブラリのC拡張機能のように、libpython
にリンクされていないC拡張機能をロードすることはできませんでした。 X190X] 。 (:issue: `21536` でVictorStinnerによって寄稿されました。)値の解析または構築におけるフォーマットの
#
バリアントの使用(例: PyArg_ParseTuple()、 Py_BuildValue()、 PyObject_CallFunction()など)PY_SSIZE_T_CLEAN
が定義されていない場合、DeprecationWarning
が発生するようになりました。 3.10または4.0で削除されます。 詳細については、引数の解析と値の構築をお読みください。 (:issue: `36381` で稲田直樹によって寄稿されました。)ヒープに割り当てられた型のインスタンス( PyType_FromSpec()で作成されたものなど)は、それらの型オブジェクトへの参照を保持します。 これらのタイプオブジェクトの参照カウントの増加は、 PyType_GenericAlloc()からより低レベルの関数 PyObject_Init()および
PyObject_INIT()
に移動されました。 これにより、 PyType_FromSpec()を介して作成された型は、マネージコード内の他のクラスのように動作します。静的に割り当てられたタイプは影響を受けません。
ほとんどの場合、副作用はないはずです。 ただし、インスタンスを割り当てた後に参照カウントを手動で増やすタイプ(おそらくバグを回避するため)は、不滅になる可能性があります。 これを回避するには、これらのクラスは、インスタンスの割り当て解除中に型オブジェクトでPy_DECREFを呼び出す必要があります。
これらのタイプを3.8に正しく移植するには、次の変更を適用してください。
インスタンスを割り当てた後、型オブジェクトの Py_INCREF を削除します(存在する場合)。 これは、 PyObject_New()、 PyObject_NewVar()、 PyObject_GC_New()、 PyObject_GC_NewVar()、またはその他のカスタムアロケータを呼び出した後に発生する可能性があります。 PyObject_Init()または
PyObject_INIT()
を使用します。例:
static foo_struct * foo_new(PyObject *type) { foo_struct *foo = PyObject_GC_New(foo_struct, (PyTypeObject *) type); if (foo == NULL) return NULL; #if PY_VERSION_HEX < 0x03080000 // Workaround for Python issue 35810; no longer necessary in Python 3.8 PY_INCREF(type) #endif return foo; }
ヒープに割り当てられたタイプのすべてのカスタム
tp_dealloc
関数が、タイプの参照カウントを減らすことを確認してください。例:
static void foo_dealloc(foo_struct *instance) { PyObject *type = Py_TYPE(instance); PyObject_GC_Del(instance); #if PY_VERSION_HEX >= 0x03080000 // This was not needed before Python 3.8 (Python issue 35810) Py_DECREF(type); #endif }
(:issue: `35810` でEddieElizondoによって寄稿されました。)
Py_DEPRECATED()マクロがMSVCに実装されました。 マクロは、シンボル名の前に配置する必要があります。
例:
Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void);
(:issue: `33407` のZackerySpytzによる寄稿。)
インタプリタは、機能リリース間での拡張タイプのバイナリ互換性をサポートするふりをしなくなりました。 サードパーティの拡張モジュールによってエクスポートされた PyTypeObject には、 tp_finalize ( Py_TPFLAGS_HAVE_FINALIZE を含む)が現在のPythonバージョンで期待されるすべてのスロットが含まれているはずです。 tp_finalize を読む前に)。
(:issue: `32388` のAntoinePitrouによる寄稿。)
関数
PyNode_AddChild()
およびPyParser_AddToken()
は、2つの追加のint
引数 end_lineno および end_col_offset を受け入れるようになりました。MinGWツールが
python38.dll
に対して直接リンクできるようにするlibpython38.a
ファイルは、通常のWindowsディストリビューションに含まれなくなりました。 このファイルが必要な場合は、MinGWbinutilsパッケージの一部であるgendef
およびdlltool
ツールを使用して生成できます。gendef - python38.dll > tmp.def dlltool --dllname python38.dll --def tmp.def --output-lib libpython38.a
インストールされる
pythonXY.dll
の場所は、インストールオプション、およびWindowsのバージョンと言語によって異なります。 詳細については、 WindowsでのPythonの使用を参照してください。 結果のライブラリは、pythonXY.lib
と同じディレクトリに配置する必要があります。これは通常、Pythonインストールの下のlibs
ディレクトリです。(:issue: `37351` でSteveDowerによって寄稿されました。)
CPythonバイトコードの変更
ブロックのスタックをコンパイラーに展開するロジックを移動することにより、インタープリターループが簡略化されました。 コンパイラは、値のスタックを調整し、 break 、 continue 、および return のクリーンアップコードを呼び出すための明示的な命令を発行するようになりました。
削除されたオペコード:opcode: `BREAK_LOOP` 、:opcode:` CONTINUE_LOOP` 、:opcode: `SETUP_LOOP` および:opcode:` SETUP_EXCEPT` 。 新しいオペコード:opcode: `ROT_FOUR` 、:opcode:` BEGIN_FINALLY` 、:opcode: `CALL_FINALLY` および:opcode:` POP_FINALLYを追加しました`。 :opcode: `END_FINALLY` および:opcode:` WITH_CLEANUP_START` の動作を変更しました。
(:issue: `17611` でMarkShannon、Antoine Pitrou、Serhiy Storchakaによって寄稿されました。)
async for ループで次のアイテムを待機するときに発生する例外を処理するための新しいオペコード:opcode: `END_ASYNC_FOR` が追加されました。 (:issue: `33041` のSerhiyStorchakaによる寄稿。)
:opcode: `MAP_ADD` は、値をスタックの最初の要素として、キーを2番目の要素として期待するようになりました。 この変更は、 PEP 572 によって提案されているように、キーが常に辞書内包表記の値の前に評価されるように行われました。 (:issue: `35224` でJörnHeisslerによって寄稿されました。)
デモとツール
変数にアクセスするさまざまな方法のタイミングを計るためのベンチマークスクリプトを追加しました:Tools/scripts/var_access_benchmark.py
。 (:issue: `35884` でRaymondHettingerによって寄稿されました。)
Python3.3以降のパフォーマンス向上の概要は次のとおりです。
Python version 3.3 3.4 3.5 3.6 3.7 3.8
-------------- --- --- --- --- --- ---
Variable and attribute read access:
read_local 4.0 7.1 7.1 5.4 5.1 3.9
read_nonlocal 5.3 7.1 8.1 5.8 5.4 4.4
read_global 13.3 15.5 19.0 14.3 13.6 7.6
read_builtin 20.0 21.1 21.6 18.5 19.0 7.5
read_classvar_from_class 20.5 25.6 26.5 20.7 19.5 18.4
read_classvar_from_instance 18.5 22.8 23.5 18.8 17.1 16.4
read_instancevar 26.8 32.4 33.1 28.0 26.3 25.4
read_instancevar_slots 23.7 27.8 31.3 20.8 20.8 20.2
read_namedtuple 68.5 73.8 57.5 45.0 46.8 18.4
read_boundmethod 29.8 37.6 37.9 29.6 26.9 27.7
Variable and attribute write access:
write_local 4.6 8.7 9.3 5.5 5.3 4.3
write_nonlocal 7.3 10.5 11.1 5.6 5.5 4.7
write_global 15.9 19.7 21.2 18.0 18.0 15.8
write_classvar 81.9 92.9 96.0 104.6 102.1 39.2
write_instancevar 36.4 44.6 45.8 40.0 38.9 35.5
write_instancevar_slots 28.7 35.6 36.1 27.3 26.6 25.7
Data structure read access:
read_list 19.2 24.2 24.5 20.8 20.8 19.0
read_deque 19.9 24.7 25.5 20.2 20.6 19.8
read_dict 19.7 24.3 25.7 22.3 23.0 21.0
read_strdict 17.9 22.6 24.3 19.5 21.2 18.9
Data structure write access:
write_list 21.2 27.1 28.5 22.5 21.6 20.0
write_deque 23.8 28.7 30.1 22.7 21.8 23.5
write_dict 25.9 31.4 33.3 29.3 29.2 24.7
write_strdict 22.9 28.4 29.9 27.5 25.2 23.1
Stack (or queue) operations:
list_append_pop 144.2 93.4 112.7 75.4 74.2 50.8
deque_append_pop 30.4 43.5 57.0 49.4 49.2 42.5
deque_append_popleft 30.8 43.7 57.3 49.7 49.7 42.8
Timing loop:
loop_overhead 0.3 0.5 0.6 0.4 0.3 0.3
ベンチマークは、 python.org にあるmacOS64ビットビルドを実行するIntel®Core™i7-4960HQプロセッサで測定されました。 ベンチマークスクリプトは、タイミングをナノ秒単位で表示します。
Python3.8.1での注目すべき変更
重大なセキュリティ上の懸念により、asyncio.loop.create_datagram_endpoint()
の reuse_address パラメーターはサポートされなくなりました。 これは、UDPのソケットオプションSO_REUSEADDR
の動作が原因です。 詳細については、loop.create_datagram_endpoint()
のドキュメントを参照してください。 (:issue: `37228` で、Kyle Stanley、Antoine Pitrou、およびYury Selivanovによって寄稿されました。)
Python3.8.2での注目すべき変更
shutil.copytree()のignore
コールバックでのリグレッションを修正しました。 引数の型はstrとList [str]になりました。 (:issue: `39390` でManuelBarkhauとGiampaoloRodolaによって寄稿されました。)
Python3.8.3での注目すべき変更
__ future __ モジュールのfutureフラグの定数値は、コンパイラフラグとの衝突を防ぐために更新されます。 以前は、PyCF_ALLOW_TOP_LEVEL_AWAIT
はCO_FUTURE_DIVISION
と衝突していました。 (:issue: `39562` のBatuhanTaskayaによる寄稿)
Python3.8.8での注目すべき変更
以前のPythonバージョンでは、 urllib.parse.parse_qs()および urllib.parse.parse_qsl()のクエリパラメーター区切り文字として;
と&
の両方を使用できました。 ]。 セキュリティ上の懸念と、新しいW3Cの推奨事項に準拠するために、これは、&
をデフォルトとして、単一の区切りキーのみを許可するように変更されました。 この変更は、影響を受ける関数を内部で使用するため、 cgi.parse()および cgi.parse_multipart()にも影響します。 詳細については、それぞれのドキュメントを参照してください。 (:issue: `42967` でAdamGoldschmidt、Senthil Kumaran、Ken Jinによって寄稿されました。)
Python3.8.9での注目すべき変更
セキュリティ修正により、 ftplib.FTP の動作が変更され、パッシブデータチャネルを設定するときにリモートサーバーから送信されたIPv4アドレスが信頼されなくなります。 代わりに、ftpサーバーのIPアドレスを再利用します。 古い動作を必要とする異常なコードの場合は、FTPインスタンスのtrust_server_pasv_ipv4_address
属性をTrue
に設定します。 (:issue: `43285` を参照)
Python3.8.10での注目すべき変更
macOS 11.0(Big Sur)およびApple SiliconMacのサポート
3.8.10以降、PythonはmacOS 11(Big Sur)およびApple Silicon Mac(ARM64
アーキテクチャに基づく)でのビルドと実行をサポートするようになりました。 新しいユニバーサルビルドバリアントuniversal2
が利用可能になり、1セットの実行可能ファイルでARM64
とIntel 64
の両方をネイティブにサポートできるようになりました。 Python 3.9のこのバックポートには、実行時に不足している機能をテストすることで古いバージョンでも正しく実行される、新しいバージョンのmacOSを対象としたバイナリを構築する「weaklinking」のサポートが含まれていないことに注意してください。 さまざまなmacOSバージョンをサポートするには、引き続きその範囲内の最も古いバージョンをターゲットにしてビルドします。
(元々は:issue: `41100` でRonaldOussorenとLawrenceD'Annaによって寄稿され、FXCoudertとEliRykoffによって修正され、MaximeBélangerとNed Deilyによって3.8にバックポートされました)
Python3.8.10での注目すべき変更
urllib.parse
URLの一部に改行文字またはタブ文字が含まれていると、何らかの形の攻撃が可能になります。 RFC 3986 を更新するWHATWG仕様に従って、ASCII改行\n
、\r
、およびタブ\t
文字がURLから削除されます urllib.parse のパーサーによってそのような攻撃を防ぎます。 削除文字は、新しいモジュールレベル変数urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE
によって制御されます。 (:issue: `43882` を参照)
Python3.8.12での注目すべき変更
PythonAPIの変更
Python 3.8.12以降、 ipaddress モジュールはIPv4アドレス文字列の先行ゼロを受け入れなくなりました。 先行ゼロはあいまいであり、一部のライブラリでは8進表記として解釈されます。 たとえば、レガシー関数 socket.inet_aton()は、先行ゼロを8進表記として扱います。 最新の inet_pton()のglibc実装は、先行ゼロを受け入れません。
(元々は:issue: `36384` でChristianHeimesによって寄稿され、Achraf Merzoukiによって3.8にバックポートされました)