この記事では、Python 3.7におけるいくつかの大きな変更点と追加された機能を紹介します。
1.レガシーCロケールをUTF-8ベースのロケールに強制する
Python 3.7では、デフォルトのインタプリタコマンドラインインタフェースがアップグレードされ、自動的にそのロケールがUTF-8ベースのロケールに強制されます。自動設定LC_CTYPEというのは、ロケール対応C拡張(readlineなど)とコアインタプリタの両方が、ASCIIではなくデフォルトのテキストエンコーディングとしてUTF-8の使用を前提としていることを意味します。
stdoutとstdinのデフォルトのエラーハンドラは、(strictではなく)surrogateescapeです。 stderrの場合、ロケールに関係なく、バックスラッシュで置き換えられています。
デフォルトでは、ロケール強制はサイレントです。ただし、ロケール統合に関連する問題のデバッグを支援するため、PYTHONCOERCECLOCALE = warnと調整して明示的な警告を要求することができます。また、コアインタプリタの初期化中にレガシーCロケールがアクティブのままであれば、Pythonランタイムは警告を返すことができます。
2.CPythonにおけるスレッドローカルストレージ用の新しいC API
現在のTLS(スレッドローカルストレージ)APIでは、intを使用して各プラットフォームのTLSキーを表します。しかし、POSIXには準拠しておらず、また、ポータブルでもありません。
新しいPythonバージョンでは、CPythonインタプリタ内の現在のTLS APIをオーバーライドする新しいTSS(スレッド固有ストレージ)APIをCPythonに与えることで、これが変更されています。
intを使用するのではなく、新しいAPIは新しいタイプのPy_tss_tを使用してTSSキーを表します。ネイティブのTLSキーがintに正しくキャストできないと定義されているプラットフォームでもCPythonを開発することができます。 TLS APIのすべての機能はノーオペレーション命令で、直ちに失敗を返すでしょう。
3.新しい組み込み関数ブレークポイント()
Python 3.7には、呼び出しの時点でPythonデバッガに入る新しい組み込み関数ブレークポイント()が付属しています。 sys.breakpointhook()を呼び出してpdbをインポートし、pdb.set_trace()を呼び出します。ブレークポイント()は、選択している関数にsys.breakpointhook()をバインドすることで、デバッガに入ることができます。
新しい環境変数PYTHONBREAKPOINT()によって、外部プロセスはブレークポイントの処理方法を制御できます。 PYTHONBREAKPOINT = 0に設定するとデバッグが無効になり、sys.breakpointhook()はただちにNoneを返します。
4.HTTPサーバー
HTTP If-Modified-SinceヘッダーはSimpleHTTPRequestHandlerでサポートされています。ヘッダーで指定された時間後にターゲット・ファイルを変更しないと、サーバーは304レスポンスステータスを返します。
デフォルトでは、サーバーは現在の作業ディレクトリを提供しますが、モジュールサーバーのコマンドラインに-directoryを追加し、SimpleHTTPRequestHandlerにパラメータディレクトリを追加することにより、サーバーに特定のディレクトリを使用させることができます。
5.改良されたモジュール- argparse
parse_intermixed_args()とparse_known_intermixed_args()では、多くのUnixコマンドと同様に、オプション引数を位置引数と混在させることができます。
ただし、これらのパーサーはすべてのargparse機能をサポートしているわけではなく、サポートされていない機能を使用すると例外が発生します。
6.カレンダーとCGI
HTMLCalendarクラスには、作成されたHTMLカレンダーのCSSクラスを簡単にカスタマイズできる新しい属性があります。
parse_multipart()は、FieldStorageと同じ出力を返します。非ファイルフィールドの場合、値はバイトではなく文字列のリストです。使用するのは簡単ですが、メガバイト単位でアップロードする場合は効率的ではありませんので、FieldStorageクラスは非常にフレキシブルです。
7.ElementPathとZipapp
find()のElementPath述部は、[ . = “text” ]で現在のノードのテキストを比較できます。完全なテキストコンテンツ(旧型を含む)が指定されたテキストと等しいすべての要素を選択します。
zipapp.create_archive()関数は、アーカイブに含めるファイルを選択できるフィルタ引数(オプション)と、圧縮アーカイブを作成する圧縮引数(オプション)を取り出します。
8.高速化されたメソッド呼び出しと文字列検索
Python 3.7には、メソッド呼び出しのためにバインドされたメソッドオブジェクトのインスタンス化を避けるための2つの新しいオペコードCALL_METHODとLOAD_METHODが付属しています。これにより、メソッド呼び出しは以前のバージョンと比較して最大20%速くなります。
また、文字列内の普遍的なUnicode文字(たとえば “Є”)を見つけるのにかかる時間が短縮されました。
9.C API
結果の型はPyThread_get_thread_ident()とPyThread_start_new_thread()で、PyThreadState_SetAsyncExc()のidパラメータはlongからunsigned longにアップグレードされました。
PyUnicode_AsWideCharString()は、wchar_t *文字列にヌル文字があり、2番目の引数(size)がヌルの場合、ValueErrorを返します。
10.set_trace()のDisとヘッダー
dis()を使用すると、コンパイルコード、ネストされた関数、ジェネレータ式、およびネストされたクラスの開発に使用されるコードを含むネストされたコードオブジェクトを逆アセンブルできます。
▼プログラミングについて、これらの記事は読まれましたか?
・2017年に学ぶべき!将来普及するかもしれないプログラミング言語4つを紹介
・【プログラマー必見】コーディングとプログラミングにぴったりの無料フォント10選
※本記事はWhat’s New In Python 3.7 | 10 Biggest Features and Changesを翻訳・再構成したものです。