Python2.3の新機能
- 著者
- 午前 Kuchling
この記事では、Python2.3の新機能について説明します。 Python2.3は2003年7月29日にリリースされました。
Python 2.3の主なテーマは、2.2で追加された機能のいくつかを磨き、コア言語にさまざまな小さいながらも便利な拡張機能を追加し、標準ライブラリを拡張することです。 以前のバージョンで導入された新しいオブジェクトモデルは、18か月のバグ修正と、新しいスタイルのクラスのパフォーマンスを向上させた最適化の取り組みの恩恵を受けています。 sum()や enumerate()など、いくつかの新しい組み込み関数が追加されました。 in 演算子を部分文字列検索に使用できるようになりました(例: "ab" in "abc"
は True )を返します。
多くの新しいライブラリ機能には、ブール、セット、ヒープ、日付/時刻のデータ型、ZIP形式のアーカイブからモジュールをインポートする機能、待望のPythonカタログのメタデータのサポート、IDLEの更新バージョン、モジュールなどがあります。メッセージのログ記録、テキストの折り返し、CSVファイルの解析、コマンドラインオプションの処理、BerkeleyDBデータベースの使用など、新しいモジュールと拡張されたモジュールのリストは長くなります。
この記事では、新機能の完全な仕様を提供するのではなく、便利な概要を提供します。 詳細については、PythonライブラリリファレンスやPythonリファレンスマニュアルなど、Python2.3のドキュメントを参照してください。 完全な実装と設計の理論的根拠を理解したい場合は、特定の新機能についてPEPを参照してください。
PEP 218:標準セットのデータ型
新しいsets
モジュールには、セットデータ型の実装が含まれています。 Set
クラスは、メンバーを追加および削除できる可変セット用です。 ImmutableSet
クラスは変更できないセット用であるため、ImmutableSet
のインスタンスを辞書キーとして使用できます。 セットは辞書の上に構築されるため、セット内の要素はハッシュ可能である必要があります。
簡単な例を次に示します。
セットの和集合と共通部分は、union()
およびintersection()
メソッドを使用して計算できます。 別の表記法では、ビット演算子&
および|
を使用します。 可変セットには、これらのメソッドのインプレースバージョンunion_update()
およびintersection_update()
もあります。
2つのセットの対称差を取ることも可能です。 これは、共通部分にないユニオン内のすべての要素のセットです。 別の言い方をすれば、対称差には、正確に1つのセットに含まれるすべての要素が含まれます。 繰り返しになりますが、別の表記法(^
)と、不格好な名前symmetric_difference_update()
のインプレースバージョンがあります。
あるセットが別のセットのサブセットであるかスーパーセットであるかをチェックするためのissubset()
およびissuperset()
メソッドもあります。
も参照してください
- PEP 218 -組み込みのセットオブジェクトタイプの追加
- グレッグVによって書かれたPEP。 ウィルソン。 グレッグVによって実装されました。 ウィルソン、アレックスマルテッリ、GvR。
PEP 255:シンプルなジェネレーター
Python 2.2では、ジェネレーターがオプション機能として追加され、from __future__ import generators
ディレクティブで有効になりました。 2.3では、ジェネレーターを特別に有効にする必要がなくなり、常に存在するようになりました。 これは、 yield が常にキーワードになることを意味します。 このセクションの残りの部分は、「Python2.2の新機能」ドキュメントのジェネレーターの説明のコピーです。 Python 2.2がリリースされたときに読み返した場合は、このセクションの残りの部分をスキップできます。
PythonまたはCで関数呼び出しがどのように機能するかについては間違いなくよく知っています。 関数を呼び出すと、ローカル変数が作成されるプライベート名前空間が取得されます。 関数が return ステートメントに達すると、ローカル変数が破棄され、結果の値が呼び出し元に返されます。 後で同じ関数を呼び出すと、新しいローカル変数のセットが取得されます。 しかし、関数の終了時にローカル変数が破棄されなかった場合はどうなるでしょうか。 後で中断したところから機能を再開できるとしたらどうでしょうか。 これはジェネレーターが提供するものです。 それらは再開可能な機能と考えることができます。
ジェネレーター関数の最も簡単な例を次に示します。
新しいキーワード yield がジェネレーターに導入されました。 yield
ステートメントを含む関数はすべてジェネレーター関数です。 これは、結果として関数を特別にコンパイルするPythonのバイトコードコンパイラによって検出されます。
ジェネレーター関数を呼び出すと、単一の値は返されません。 代わりに、イテレータプロトコルをサポートするジェネレータオブジェクトを返します。 yield ステートメントを実行すると、ジェネレーターは return ステートメントと同様に、i
の値を出力します。 yield
ステートメントとreturn
ステートメントの大きな違いは、yield
に達すると、ジェネレーターの実行状態が一時停止され、ローカル変数が保持されることです。 ジェネレータの.next()
メソッドの次の呼び出しで、関数はyield
ステートメントの直後に実行を再開します。 (複雑な理由により、yield
ステートメントはtry
…finally
ステートメントの try ブロック内では許可されていません。 を読んでください。 yield
と例外の間の相互作用の完全な説明については、] PEP 255 を参照してください。)
generate_ints()
ジェネレーターの使用例は次のとおりです。
同様に、for i in generate_ints(5)
またはa,b,c = generate_ints(3)
と書くこともできます。
ジェネレーター関数内では、 return ステートメントは値なしでのみ使用でき、値の行列の終了を通知します。 その後、ジェネレータはそれ以上の値を返すことができなくなります。 return 5
などの値を持つreturn
は、ジェネレーター関数内の構文エラーです。 ジェネレーターの結果の終了は、 StopIteration を手動で上げるか、実行フローを関数の下部から外すことによっても示すことができます。
独自のクラスを作成し、ジェネレーターのすべてのローカル変数をインスタンス変数として格納することで、ジェネレーターの効果を手動で実現できます。 たとえば、整数のリストを返すには、self.count
を0に設定し、 next()メソッドでself.count
をインクリメントして返します。 ただし、適度に複雑なジェネレーターの場合、対応するクラスを作成するのは非常に面倒です。 Lib/test/test_generators.py
には、さらに興味深い例がいくつか含まれています。 最も単純なものは、ジェネレーターを再帰的に使用して、ツリーの順序どおりの走査を実装します。
Lib/test/test_generators.py
の他の2つの例では、N-Queensの問題($ N $の女王を$ NxN $のチェス盤に配置して、女王が他の女王を脅かさないようにする)とKnight's Tour(騎士を$ NxN $チェス盤のすべての正方形で、どの正方形にも2回アクセスする必要はありません)。
ジェネレーターのアイデアは、他のプログラミング言語、特にジェネレーターのアイデアが中心となるIcon( https://www.cs.arizona.edu/icon/ )から来ています。 Iconでは、すべての式と関数呼び出しはジェネレーターのように動作します。 https://www.cs.arizona.edu/icon/docs/ipd266.htm の「アイコンプログラミング言語の概要」の1つの例は、これがどのように見えるかを示しています。
アイコンでは、find()
関数は、部分文字列「or」が見つかったインデックスを返します:3、23、33。 if ステートメントでは、i
に最初に値3が割り当てられますが、3は5未満であるため、比較は失敗し、Iconは2番目の値23で再試行します。 23は5より大きいため、比較は成功し、コードは値23を画面に出力します。
Pythonは、ジェネレーターを中心的な概念として採用するという点で、Iconほどまでは進んでいません。 ジェネレーターはコアPython言語の一部と見なされますが、ジェネレーターの学習や使用は必須ではありません。 彼らがあなたが持っている問題を解決しないならば、それらを無視してください。 Iconと比較したPythonのインターフェースの新しい機能の1つは、ジェネレーターの状態が、他の関数に渡したり、データ構造に格納したりできる具体的なオブジェクト(イテレーター)として表されることです。
も参照してください
- PEP 255 -シンプルなジェネレーター
- Neil Schemenauer、Tim Peters、Magnus LieHetlandによって書かれました。 主にNeilSchemenauerとTimPetersによって実装され、PythonLabsのクルーから他の修正が加えられました。
PEP 263:ソースコードエンコーディング
Pythonソースファイルは、異なる文字セットエンコーディングであると宣言できるようになりました。 エンコーディングは、ソースファイルの1行目または2行目に特別にフォーマットされたコメントを含めることによって宣言されます。 たとえば、UTF-8ファイルは次のように宣言できます。
このようなエンコーディング宣言がない場合、使用されるデフォルトのエンコーディングは7ビットASCIIです。 8ビット文字の文字列リテラルを含み、エンコーディング宣言がないモジュールを実行またはインポートすると、Python2.3によって DeprecationWarning が通知されます。 2.4では、これは構文エラーになります。
エンコーディング宣言は、指定されたエンコーディングを使用してUnicodeに変換されるUnicode文字列リテラルにのみ影響します。 Python識別子は引き続きASCII文字に制限されているため、通常の英数字以外の文字を使用する変数名を使用することはできません。
も参照してください
- PEP 263 -Pythonソースコードエンコーディングの定義
- Marc-AndréLemburgとMartinvonLöwisによって書かれました。 鈴木久雄とマーティン・フォン・レーウィスによって実装されました。
PEP 273:ZIPアーカイブからのモジュールのインポート
新しい zipimport モジュールは、ZIP形式のアーカイブからモジュールをインポートするためのサポートを追加します。 モジュールを明示的にインポートする必要はありません。 ZIPアーカイブのファイル名がsys.path
に追加されると、自動的にインポートされます。 例えば:
amk@nyman:~/src/python$ unzip -l /tmp/example.zip
Archive: /tmp/example.zip
Length Date Time Name
-------- ---- ---- ----
8467 11-26-02 22:30 jwzthreading.py
-------- -------
8467 1 file
amk@nyman:~/src/python$ ./python
Python 2.3 (#1, Aug 1 2003, 19:54:32)
>>> import sys
>>> sys.path.insert(0, '/tmp/example.zip') # Add .zip file to front of path
>>> import jwzthreading
>>> jwzthreading.__file__
'/tmp/example.zip/jwzthreading.py'
>>>
sys.path
のエントリを、ZIPアーカイブのファイル名にすることができるようになりました。 ZIPアーカイブには任意の種類のファイルを含めることができますが、インポートできるのは*.py
、*.pyc
、または*.pyo
という名前のファイルのみです。 アーカイブに*.py
ファイルのみが含まれている場合、Pythonは対応する*.pyc
ファイルを追加してアーカイブを変更しようとはしません。つまり、ZIPアーカイブに*.pyc
ファイルが含まれていない場合です。 、インポートはかなり遅い場合があります。
アーカイブ内のパスを指定して、サブディレクトリからのみインポートすることもできます。 たとえば、パス/tmp/example.zip/lib/
は、アーカイブ内のlib/
サブディレクトリからのみインポートされます。
も参照してください
- PEP 273 -Zipアーカイブからモジュールをインポートします
- ジェームズCによって書かれました。 実装も提供したAhlstrom。 Python 2.3は、 PEP 273 の仕様に従いますが、 PEP 302 で説明されているインポートフックを使用するJustvanRossumによって作成された実装を使用します。 ]。 新しいインポートフックの説明については、セクション PEP 302:新しいインポートフックを参照してください。
PEP 277:WindowsNTのUnicodeファイル名のサポート
Windows NT、2000、およびXPでは、システムはファイル名をUnicode文字列として保存します。 従来、Pythonはファイル名をバイト文字列として表していましたが、一部のファイル名にアクセスできなくなるため、これは不十分です。
Pythonでは、ファイル名を期待するすべての関数、特に open()組み込み関数に、(ファイルシステムの制限内で)任意のUnicode文字列を使用できるようになりました。 Unicode文字列が os.listdir()に渡された場合、PythonはUnicode文字列のリストを返すようになりました。 新しい関数os.getcwdu()
は、現在のディレクトリをUnicode文字列として返します。
バイト文字列は引き続きファイル名として機能し、WindowsではPythonはmbcs
エンコーディングを使用してそれらを透過的にUnicodeに変換します。
他のシステムでもファイル名としてUnicode文字列を使用できますが、システムに渡す前にバイト文字列に変換するため、 UnicodeError が発生する可能性があります。 アプリケーションは、ブール値である os.path.supports_unicode_filenames をチェックすることにより、任意のUnicode文字列がファイル名としてサポートされているかどうかをテストできます。
MacOSでは、 os.listdir()がUnicodeファイル名を返す場合があります。
も参照してください
- PEP 277 -WindowsNTのUnicodeファイル名のサポート
- ニールホジソンによって書かれました。 Neil Hodgson、MartinvonLöwis、MarkHammondによって実装されました。
PEP 278:ユニバーサル改行サポート
現在使用されている3つの主要なオペレーティングシステムは、Microsoft Windows、AppleのMacintosh OS、およびさまざまなUnix派生物です。 クロスプラットフォーム作業のちょっとした苛立ちは、これら3つのプラットフォームがすべて、テキストファイルの行末をマークするために異なる文字を使用していることです。 Unixは改行(ASCII文字10)を使用し、MacOSはキャリッジリターン(ASCII文字13)を使用し、Windowsはキャリッジリターンと改行の2文字のシーケンスを使用します。
Pythonのファイルオブジェクトは、Pythonが実行されているプラットフォームが従うもの以外の行末規則をサポートできるようになりました。 モード'U'
または'rU'
でファイルを開くと、ユニバーサルニューラインモードで読み取るためにファイルが開きます。 3つの行終了規則はすべて、read()
や readline()などのさまざまなファイルメソッドによって返される文字列の'\n'
に変換されます。
ユニバーサル改行サポートは、モジュールをインポートするとき、およびexecfile()
関数を使用してファイルを実行するときにも使用されます。 つまり、Pythonモジュールは、行末を変換することなく、3つのオペレーティングシステムすべてで共有できます。
この機能は、Pythonの configure スクリプトの実行時に--without-universal-newlines
スイッチを指定することにより、Pythonのコンパイル時に無効にできます。
PEP 279:enumerate()
新しい組み込み関数 enumerate()は、特定のループを少し明確にします。 enumerate(thing)
( things はイテレーターまたはシーケンスのいずれか)は、(0, thing[0])
、(1, thing[1])
、(2, thing[2])
、を返すイテレーターを返します。などなど。
リストのすべての要素を変更する一般的なイディオムは次のようになります。
これは、 enumerate()を使用して次のように書き換えることができます。
PEP 282:ロギングパッケージ
ログを書き込むための標準パッケージ logging がPython2.3に追加されました。 ロギング出力を生成するための強力で柔軟なメカニズムを提供します。ロギング出力は、さまざまな方法でフィルタリングおよび処理できます。 標準形式で記述された構成ファイルを使用して、プログラムのロギング動作を制御できます。 Pythonには、ログレコードを標準エラーまたはファイルやソケットに書き込んだり、システムログに送信したり、特定のアドレスに電子メールで送信したりするハンドラーが含まれています。 もちろん、独自のハンドラークラスを作成することもできます。
Logger
クラスはプライマリクラスです。 ほとんどのアプリケーションコードは、1つ以上のLogger
オブジェクトを処理し、各オブジェクトはアプリケーションの特定のサブシステムによって使用されます。 各Logger
は名前で識別され、名前は.
をコンポーネント区切り文字として使用して階層に編成されます。 たとえば、server
、server.auth
、およびserver.network
という名前のLogger
インスタンスがあるとします。 後者の2つのインスタンスは、階層内でserver
の下にあります。 つまり、server
の冗長性を上げるか、server
メッセージを別のハンドラーに送信すると、変更はserver.auth
および [に記録されたレコードにも適用されます。 X184X]。 他のすべてのロガーの親であるルートLogger
もあります。
簡単に使用できるように、 logging パッケージには、常にルートログを使用する便利な関数がいくつか含まれています。
これにより、次の出力が生成されます。
デフォルト設定では、情報メッセージとデバッグメッセージは抑制され、出力は標準エラーに送信されます。 ルートロガーでsetLevel()
メソッドを呼び出すことにより、情報メッセージとデバッグメッセージの表示を有効にできます。
warning()
呼び出しで文字列フォーマット演算子が使用されていることに注意してください。 メッセージをログに記録するためのすべての関数は、引数(msg, arg1, arg2, ...)
を取り、msg % (arg1, arg2, ...)
の結果の文字列をログに記録します。
最新のトレースバックを記録するexception()
関数もあります。 キーワード引数 exc_info に真の値を指定すると、他の関数もトレースバックを記録します。
これにより、次の出力が生成されます。
少し高度なプログラムでは、ルートロガー以外のロガーを使用します。 getLogger(name)
関数は、特定のログを取得するために使用され、ログがまだ存在しない場合は作成します。 getLogger(None)
はルートロガーを返します。
ログレコードは通常、階層の上位に伝播されるため、server.auth
に記録されたメッセージはserver
およびroot
にも表示されますが、Logger
はこれを防ぐことができます。 propagate
属性を False に設定します。
logging パッケージによって提供される、カスタマイズ可能なクラスは他にもあります。 Logger
インスタンスがメッセージをログに記録するように指示されると、LogRecord
インスタンスが作成され、任意の数の異なるHandler
インスタンスに送信されます。 ロガーとハンドラーにはフィルターのリストを添付することもでき、各フィルターによってLogRecord
が無視されたり、レコードを渡す前に変更したりすることができます。 最終的に出力されると、LogRecord
インスタンスはFormatter
クラスによってテキストに変換されます。 これらのクラスはすべて、特別に作成された独自のクラスに置き換えることができます。
これらすべての機能を備えた logging パッケージは、最も複雑なアプリケーションにも十分な柔軟性を提供するはずです。 これはその機能の不完全な概要にすぎないため、すべての詳細についてはパッケージのリファレンスドキュメントを参照してください。 PEP 282 を読むことも役に立ちます。
PEP 285:ブール型
Python2.3にブール型が追加されました。 __builtin__
モジュールに True と False の2つの新しい定数が追加されました。 ( True および False 定数がPython2.2.1の組み込みに追加されましたが、2.2.1バージョンは単に1と0の整数値に設定されており、そうではありません。別のタイプ。)
この新しい型の型オブジェクトの名前は bool です。 そのコンストラクターは任意のPython値を受け取り、それを True または False に変換します。
ほとんどの標準ライブラリモジュールと組み込み関数は、ブール値を返すように変更されています。
Pythonのブール値は、コードをより明確にすることを主な目的として追加されました。 たとえば、関数を読んでいて、ステートメントreturn 1
に遭遇した場合、1
がブール真理値、インデックス、または他の量を乗算する係数を表すかどうか疑問に思うかもしれません。 ただし、ステートメントがreturn True
の場合、戻り値の意味は非常に明確です。
Pythonのブール値は、厳密な型チェックのために追加されませんでした。 Pascalなどの非常に厳密な言語では、ブール値を使用した算術演算も実行できず、 if ステートメントの式が常にブール値の結果に評価される必要があります。 PEP 285 が明示的に述べているように、Pythonはこれほど厳密ではなく、決してそうなることはありません。 つまり、if
ステートメントでは、リスト、タプル、またはランダムなオブジェクトに評価される式であっても、任意の式を使用できます。 ブール型は int クラスのサブクラスであるため、ブールを使用した算術演算は引き続き機能します。
True と False を文で要約すると、これらは整数値1と0を綴る別の方法ですが、 str()という1つの違いがあります。 repr()は、'1'
および'0'
の代わりに、文字列'True'
および'False'
を返します。
PEP 293:コールバックを処理するコーデックエラー
Unicode文字列をバイト文字列にエンコードすると、エンコードできない文字が検出される場合があります。 これまでのところ、Pythonでは、エラー処理を「strict」( UnicodeError を上げる)、「ignore」(文字をスキップ)、または「replace」(出力文字列に疑問符を使用)のいずれかとして指定できます。 「strict」がデフォルトの動作です。 変換された文字列にXML文字参照またはHTMLエンティティ参照を挿入するなど、このようなエラーの代替処理を指定することが望ましい場合があります。
Pythonには、さまざまな処理戦略を追加するための柔軟なフレームワークがあります。 codecs.register_error()を使用して新しいエラーハンドラーを追加すると、コーデックは codecs.lookup_error()を使用してエラーハンドラーにアクセスできます。 Cで記述されたコーデック用に同等のCAPIが追加されました。 エラーハンドラは、変換される文字列、エラーが検出された文字列内の位置、ターゲットエンコーディングなどの必要な状態情報を取得します。 その後、ハンドラーは例外を発生させるか、置換文字列を返すことができます。
このフレームワークを使用して、2つの追加のエラーハンドラーが実装されました。「backslashreplace」はPythonのバックスラッシュ引用符を使用してエンコードできない文字を表し、「xmlcharrefreplace」はXML文字参照を出力します。
PEP 301:Distutilsのパッケージインデックスとメタデータ
長い間要求されていたPythonカタログのサポートは、2.3で初めて登場します。
カタログの中心は、新しいDistutils register コマンドです。 ランニングpython setup.py register
名前、バージョン、メンテナ、説明など、パッケージを説明するメタデータを収集し、中央のカタログサーバーに送信します。 結果のカタログは、 https://pypi.org から入手できます。
カタログをもう少し便利にするために、新しいオプションの classifiers キーワード引数がDistutils setup()
関数に追加されました。 Trove スタイルの文字列のリストを提供して、ソフトウェアの分類に役立てることができます。
これは、古いバージョンのDistutilsと互換性があるように記述された、分類子を使用したsetup.py
の例です。
分類子の完全なリストは、python setup.py register --list-classifiers
を実行することで取得できます。
PEP 302:新しいインポートフック
ihooks
モジュールがPython1.3で導入されて以来、カスタムインポートフックを作成することは可能でしたが、新しいインポートフックを作成するのは難しく、面倒なので、誰もこれに満足していません。 imputil
モジュールやiu
モジュールなど、さまざまな代替案が提案されていますが、どれもあまり受け入れられておらず、Cコードから簡単に使用できるものもありませんでした。
PEP 302 は、その前身、特にGordonMcMillanのiu
モジュールからアイデアを借りています。 sys モジュールに3つの新しいアイテムが追加されました。
sys.path_hooks
は、呼び出し可能なオブジェクトのリストです。 ほとんどの場合、それらはクラスになります。 各callableはパスを含む文字列を受け取り、このパスからのインポートを処理するインポーターオブジェクトを返すか、このパスを処理できない場合は ImportError 例外を発生させます。sys.path_importer_cache
はパスごとにインポーターオブジェクトをキャッシュするため、sys.path_hooks
はパスごとに1回だけトラバースする必要があります。sys.meta_path
は、sys.path
がチェックされる前にトラバースされるインポーターオブジェクトのリストです。 このリストは最初は空ですが、ユーザーコードでオブジェクトを追加できます。 このリストに追加されたオブジェクトによって、追加の組み込みモジュールとフリーズモジュールをインポートできます。
インポーターオブジェクトには、find_module(fullname, path=None)
という単一のメソッドが必要です。 フルネームは、モジュール名またはパッケージ名になります。例: string
またはdistutils.core
。 find_module()
は、対応するモジュールオブジェクトを作成して返す単一のメソッドload_module(fullname)
を持つローダーオブジェクトを返す必要があります。
したがって、Pythonの新しいインポートロジックの擬似コードは次のようになります(少し簡略化されています。詳細については、 PEP 302 を参照してください)。
PEP 305:カンマ区切りファイル
コンマ区切りファイルは、データベースやスプレッドシートからデータをエクスポートするために頻繁に使用される形式です。 Python 2.3は、コンマ区切りファイル用のパーサーを追加します。
カンマ区切り形式は、一見すると一見シンプルです。
行を読んでline.split(',')
に電話します。もっと簡単なことは何でしょうか。 しかし、コンマを含む可能性のある文字列データを投げると、事態はさらに複雑になります。
大きな醜い正規表現でこれを解析できますが、新しい csv パッケージを使用する方がはるかに簡単です。
reader()
関数には、さまざまなオプションがあります。 フィールド区切り文字はコンマに限定されず、任意の文字に変更できます。また、引用符と行末の文字も変更できます。
コンマ区切りファイルのさまざまな方言を定義して登録できます。 現在、2つの方言があり、どちらもMicrosoftExcelで使用されています。 別の csv.writer クラスは、区切り文字を含む文字列を引用して、一連のタプルまたはリストからコンマ区切りのファイルを生成します。
も参照してください
- PEP 305 -CSVファイルAPI
- Kevin Altis、Dave Cole、Andrew McNamara、Skip Montanaro、CliffWellsによって作成および実装されました。
PEP 307:ピクルスの機能強化
pickle およびcPickle
モジュールは、2.3の開発サイクル中にいくつかの注目を集めました。 2.2では、新しいスタイルのクラスを問題なくピクルス化できましたが、それほどコンパクトにピクルス化されていませんでした。 PEP 307 は、新しいスタイルのクラスがクラシッククラスの3倍長いピクルスストリングになるという些細な例を引用しています。
解決策は、新しいピクルスプロトコルを発明することでした。 pickle.dumps()関数は、長い間、テキストまたはバイナリフラグをサポートしてきました。 2.3では、このフラグはブール値から整数に再定義されています。0は古いテキストモードのピクルス形式、1は古いバイナリ形式、2は新しい2.3固有の形式です。 新しい定数 pickle.HIGHEST_PROTOCOL を使用して、利用可能な最も優れたプロトコルを選択できます。
ピッキング解除は、安全な操作とは見なされなくなりました。 2.2の pickle は、安全でないクラスが選択解除されないようにするためのフック(具体的には、__safe_for_unpickling__
属性)を提供しましたが、このコードは監査されていないため、すべてが削除されています。 2.3。 どのバージョンのPythonでも、信頼できないデータを選択解除しないでください。
新しいスタイルのクラスのピクルスのオーバーヘッドを削減するために、ピクルスをカスタマイズするための新しいインターフェイスが、__getstate__()
、__setstate__()
、および__getnewargs__()
の3つの特別なメソッドを使用して追加されました。 これらのメソッドの完全なセマンティクスについては、 PEP 307 を参照してください。
ピクルスをさらに圧縮する方法として、長い文字列の代わりに整数コードを使用してピクルスクラスを識別することが可能になりました。 Python Software Foundationは、標準化されたコードのリストを維持します。 個人使用のためのコードの範囲もあります。 現在、コードは指定されていません。
拡張スライス
Python 1.4以降、スライス構文はオプションの3番目の「ステップ」または「ストライド」引数をサポートしています。 たとえば、これらはすべて有効なPython構文です:L[1:10:2]
、L[:-1:1]
、L[::-1]
。 これは、3番目の引数を広範囲に使用するNumericalPythonの開発者の要求でPythonに追加されました。 ただし、Pythonの組み込みリスト、タプル、および文字列シーケンスタイプはこの機能をサポートしたことがないため、試してみると TypeError が発生します。 Michael Hudsonは、この欠点を修正するためのパッチを提供しました。
たとえば、インデックスさえも持つリストの要素を簡単に抽出できるようになりました。
負の値は、同じリストのコピーを逆の順序で作成するためにも機能します。
これは、タプル、配列、および文字列に対しても機能します。
リストや配列などの変更可能なシーケンスがある場合は、拡張スライスに割り当てたり削除したりできますが、拡張スライスへの割り当てと通常のスライスへの割り当てにはいくつかの違いがあります。 通常のスライスへの割り当てを使用して、シーケンスの長さを変更できます。
拡張スライスはこれほど柔軟ではありません。 拡張スライスに割り当てる場合、ステートメントの右側のリストには、置き換えるスライスと同じ数のアイテムが含まれている必要があります。
削除はより簡単です:
組み込みシーケンスの__getitem__()
メソッドにスライスオブジェクトを渡すこともできるようになりました。
または、下付き文字で直接スライスオブジェクトを使用します。
拡張スライスをサポートするシーケンスの実装を簡素化するために、スライスオブジェクトにメソッドindices(length)
が追加されました。このメソッドは、シーケンスの長さを指定すると、 range(に直接渡すことができる(start, stop, step)
タプルを返します。 )。 indices()
は、省略された範囲外のインデックスを通常のスライスと一致する方法で処理します(この無害なフレーズは、紛らわしい詳細のウェルターを隠します!)。 このメソッドは、次のように使用することを目的としています。
この例から、組み込みのスライスオブジェクトがスライスタイプのタイプオブジェクトになり、関数ではなくなったことがわかります。 これは、 int 、 str などが同じ変更を受けたPython2.2と一致しています。
その他の言語の変更
Python2.3がコアPython言語に加えるすべての変更は次のとおりです。
このドキュメントのセクション PEP 255:Simple Generators で説明されているように、 yield ステートメントは常にキーワードになりました。
このドキュメントのセクション PEP 279:enumerate()で説明されているように、新しい組み込み関数 enumerate()が追加されました。
セクション PEP 285:ブール型[このドキュメントのX158X]。
int()型コンストラクターは、文字列または浮動小数点数が大きすぎて整数に収まらない場合に、 OverflowError を発生させる代わりに、長整数を返すようになりました。 これは、
isinstance(int(expression), int)
が偽であるという逆説的な結果につながる可能性がありますが、実際には問題を引き起こす可能性は低いようです。このドキュメントのセクション拡張スライスで説明されているように、組み込み型は拡張スライス構文をサポートするようになりました。
新しい組み込み関数
sum(iterable, start=0)
は、反復可能オブジェクトの数値項目を合計し、それらの合計を返します。 sum()は数値のみを受け入れます。つまり、これを使用して一連の文字列を連結することはできません。 (Alex Martelliによる寄稿。)list.insert(pos, value)
は、 pos が負の場合に、リストの先頭に value を挿入するために使用されていました。 動作はスライスインデックスと一致するように変更されたため、 pos が-1の場合、値は最後の要素の前に挿入されます。リスト内で value を検索し、そのインデックスを返す
list.index(value)
は、オプションの start および stop 引数を取り、検索をのみに制限するようになりました。リストの一部。ディクショナリには、 key に対応する値を返し、そのキーと値のペアをディクショナリから削除する新しいメソッド
pop(key[, *default*])
があります。 要求されたキーがディクショナリに存在しない場合、指定されている場合は default が返され、指定されていない場合は KeyError が発生します。新しいクラスメソッド
dict.fromkeys(iterable, value)
もあります。このメソッドは、提供されたイテレータ iterable から取得したキーと、すべての値を value に設定し、デフォルトでNone
。(Raymond Hettingerによって提供されたパッチ。)
また、 dict()コンストラクターは、小さな辞書の作成を簡素化するためにキーワード引数を受け入れるようになりました。
(Just van Rossumによる寄稿。)
assert ステートメントは
__debug__
フラグをチェックしなくなったため、__debug__
に割り当ててアサーションを無効にすることはできなくなりました。 -O スイッチを指定してPythonを実行しても、アサーションを実行しないコードが生成されます。現在、ほとんどの型オブジェクトは呼び出し可能であるため、それらを使用して、関数、クラス、モジュールなどの新しいオブジェクトを作成できます。 (これは、 types モジュールで使用可能なtypeオブジェクトを使用できるようになったため、
new
モジュールが将来のPythonバージョンで非推奨になる可能性があることを意味します。)たとえば、新しいを作成できます。次のコードを持つモジュールオブジェクト:非推奨の処理中の機能を示すために、新しい警告 PendingDeprecationWarning が追加されました。 警告はデフォルトで印刷されません。 将来廃止される予定の機能の使用を確認するには、コマンドラインで -Walways :: PendingDeprecationWarning :: を指定するか、 warnings.filterwarnings()を使用します。
raise "Error occurred"
のように、文字列ベースの例外を非推奨にするプロセスが開始されました。 文字列を上げると、 PendingDeprecationWarning がトリガーされるようになりました。None
を変数名として使用すると、 SyntaxWarning 警告が表示されるようになりました。 Pythonの将来のバージョンでは、None
が最終的にキーワードになる可能性があります。Python2.1で導入されたファイルオブジェクトの
xreadlines()
メソッドは、ファイルが独自のイテレータとして動作するようになったため、不要になりました。xreadlines()
は元々、ファイル内のすべての行をループする高速な方法として導入されましたが、今ではfor line in file_obj
と簡単に書くことができます。 ファイルオブジェクトには、ファイルで使用されるエンコーディングを提供する新しい読み取り専用encoding
属性もあります。 ファイルに書き込まれたUnicode文字列は、指定されたエンコーディングを使用して自動的にバイトに変換されます。新しいスタイルのクラスで使用されるメソッド解決の順序が変更されましたが、非常に複雑な継承階層がある場合にのみ違いに気付くでしょう。 クラシッククラスはこの変更の影響を受けません。 Python 2.2は元々、クラスの祖先のトポロジカルソートを使用していましたが、2.3では、論文「ディランの単調スーパークラス線形化」で説明されているようにC3アルゴリズムを使用するようになりました。 この変更の動機を理解するには、MicheleSimionatoの記事「Python2.3メソッド解決順序」を読むか、 https://mail.pythonのメッセージで始まるpython-devのスレッドを読んでください。 org / pipermail / python-dev / 2002-October / 029035.html 。 Samuele Pedroniは最初に問題を指摘し、C3アルゴリズムをコーディングして修正を実装しました。
Pythonは、Nバイトコードを実行した後にスレッドを切り替えることによってマルチスレッドプログラムを実行します。 Nのデフォルト値が10バイトコードから100バイトコードに増加し、スイッチングオーバーヘッドを削減することでシングルスレッドアプリケーションを高速化しました。 マルチスレッドアプリケーションによっては応答時間が遅くなる場合がありますが、
sys.setcheckinterval(N)
を使用して制限を低い数値に戻すことで、簡単に修正できます。 制限は、新しい sys.getcheckinterval()関数で取得できます。マイナーですが広範囲にわたる変更の1つは、Pythonに含まれるモジュールによって定義された拡張タイプの名前に、モジュールとタイプ名の前に
'.'
が含まれるようになったことです。 たとえば、Python 2.2では、ソケットを作成してその__class__
を出力すると、次の出力が得られます。2.3では、次のようになります。
古いスタイルのクラスと新しいスタイルのクラスの間で指摘された非互換性の1つが削除されました。新しいスタイルのクラスの __ name __ 属性と __ bases __ 属性に割り当てることができるようになりました。 インスタンスの __ class __ 属性への割り当てに関連する制限に沿って、 __ bases __ に割り当てることができるものにいくつかの制限があります。
文字列の変更
in 演算子は、文字列に対して異なる動作をするようになりました。 以前は、 X と Y が文字列である
X in Y
を評価する場合、 X は1文字のみでした。 これは変更されました。 X は任意の長さの文字列にすることができ、 X が Y のサブストリングである場合、X in Y
は True を返します。 。 X が空の文字列の場合、結果は常に True になります。これは部分文字列がどこから始まるかを教えてくれないことに注意してください。 その情報が必要な場合は、
find()
文字列メソッドを使用してください。strip()
、lstrip()
、およびrstrip()
文字列メソッドに、削除する文字を指定するためのオプションの引数が追加されました。 デフォルトでは、すべての空白文字が削除されます。(Simon Brunningによって提案され、WalterDörwaldによって実装されました。)
startswith()
およびendswith()
文字列メソッドは、 start および end パラメーターに負の数を受け入れるようになりました。もう1つの新しい文字列メソッドは
zfill()
で、元々は string モジュールの関数です。zfill()
は、指定された幅になるまで、左側にゼロが付いた数値文字列を埋め込みます。%
演算子は、zfill()
よりもさらに柔軟で強力であることに注意してください。(WalterDörwaldによる寄稿。)
新しいタイプのオブジェクト
basestring
が追加されました。 8ビット文字列とUnicode文字列はどちらもこのタイプを継承するため、isinstance(obj, basestring)
はどちらの種類の文字列に対しても True を返します。 これは完全に抽象型であるため、basestring
インスタンスを作成することはできません。インターンされた文字列は不滅ではなくなり、インターンされた文字列の内部ディクショナリからの参照のみである場合、通常の方法でガベージコレクションされるようになりました。 (Oren Tiroshによって実装されました。)
最適化
- 新しいスタイルのクラスインスタンスの作成がはるかに高速になりました。 今ではクラシッククラスよりも高速です!
- リストオブジェクトの
sort()
メソッドは、Tim Petersによって大幅に書き直され、実装が大幅に高速化されました。 - 大きな長整数の乗算は、カラツバ乗算の実装のおかげではるかに高速になりました。これは、小学校の乗算アルゴリズムに必要なO(n * n)よりも優れたスケーリングを行うアルゴリズムです。 (クリストファーAによるオリジナルパッチ。 クレイグ、そしてティム・ピーターズによって大幅に作り直されました。)
SET_LINENO
オペコードはなくなりました。 これにより、コンパイラの特異性によっては、速度がわずかに向上する場合があります。 詳細については、セクションその他の変更と修正を参照してください。 (マイケルハドソンによって削除されました。)xrange()
オブジェクトに独自のイテレータが追加され、for i in xrange(n)
がfor i in range(n)
よりもわずかに高速になりました。 (レイモンドヘッティンガーによるパッチ。)- 関数のインライン化や一部のコードの削除など、パフォーマンスを向上させるために、さまざまなホットスポットでいくつかの小さな再配置が行われました。 (主にGvRによって実装されていますが、多くの人が単一の変更に貢献しています。)
The net result of the 2.3 optimizations is that Python 2.3 runs the pystone benchmark around 25% faster than Python 2.2.
新規、改善、および非推奨のモジュール
いつものように、Pythonの標準ライブラリは多くの機能強化とバグ修正を受けました。 これは、モジュール名のアルファベット順にソートされた、最も注目すべき変更の部分的なリストです。 変更のより完全なリストについては、ソースツリーのMisc/NEWS
ファイルを参照するか、すべての詳細についてCVSログを調べてください。
array モジュールは、
'u'
形式の文字を使用したUnicode文字の配列をサポートするようになりました。 配列は、+=
代入演算子を使用して別の配列の内容を追加し、*=
代入演算子を使用して配列を繰り返すこともサポートするようになりました。 (Jason Orendorffによる寄稿)bsddb
モジュールは PyBSDDB パッケージのバージョン4.1.6に置き換えられ、BerkeleyDBライブラリのトランザクション機能へのより完全なインターフェイスを提供します。古いバージョンのモジュールは
bsddb185
に名前が変更され、自動的にビルドされなくなりました。 有効にするには、Modules/Setup
を編集する必要があります。 新しいbsddb
パッケージは古いモジュールとの互換性を目的としているため、非互換性を発見した場合は必ずバグを報告してください。 Python 2.3にアップグレードするときに、新しいインタープリターが基盤となるBerkeleyDBライブラリの新しいバージョンでコンパイルされている場合は、ほぼ確実にデータベースファイルを新しいバージョンに変換する必要があります。 これは、ディストリビューションのTools/scripts
ディレクトリにある新しいスクリプトdb2pickle.py
およびpickle2db.py
を使用してかなり簡単に行うことができます。 すでにPyBSDDBパッケージを使用していて、bsddb3
としてインポートしている場合は、import
ステートメントを変更してbsddb
としてインポートする必要があります。新しい bz2 モジュールは、bz2データ圧縮ライブラリへのインターフェイスです。 bz2で圧縮されたデータは、通常、対応する zlib で圧縮されたデータよりも小さくなります。 (Gustavo Niemeyerによる寄稿。)
新しい datetime モジュールに、標準の日付/時刻タイプのセットが追加されました。 詳細については、次のセクションを参照してください。
Distutils
Extension
クラスは、拡張子が依存する追加のソースファイルを一覧表示するために、 depends という名前の追加のコンストラクター引数をサポートするようになりました。 これにより、依存関係ファイルのいずれかが変更された場合、Distutilsはモジュールを再コンパイルできます。 たとえば、sampmodule.c
にヘッダーファイルsample.h
が含まれている場合、次のようにExtension
オブジェクトを作成します。sample.h
を変更すると、モジュールが再コンパイルされます。 (Jeremy Hyltonによる寄稿。)Distutilsに対するその他のマイナーな変更:
CC
、CFLAGS
、CPP
、LDFLAGS
、およびCPPFLAGS
環境変数。これらを使用して、Pythonの構成の設定をオーバーライドします(Robert Weberによる寄稿)。以前は、 doctest モジュールは、テストケースのパブリックメソッドと関数のドキュメント文字列のみを検索していましたが、プライベートのものも検索するようになりました。
DocTestSuite()
関数は、一連の doctest テストから unittest.TestSuite オブジェクトを作成します。新しい
gc.get_referents(object)
関数は、 object によって参照されるすべてのオブジェクトのリストを返します。getopt モジュールは、既存の getopt()関数と同じ引数をサポートするが、GNUスタイルのスキャンモードを使用する新しい関数
gnu_getopt()
を取得しました。 既存の getopt()は、オプション以外の引数が検出されるとすぐにオプションの処理を停止しますが、GNUスタイルのモードでは処理が続行されるため、オプションと引数を混在させることができます。 例えば:(PeterÅstrandによる寄稿。)
grp 、 pwd 、および resource モジュールは、拡張タプルを返すようになりました。
gzip モジュールは、2GiBを超えるファイルを処理できるようになりました。
新しい heapq モジュールには、ヒープキューアルゴリズムの実装が含まれています。 ヒープは、すべてのインデックス k 、
heap[k] <= heap[2*k+1]
、およびheap[k] <= heap[2*k+2]
のように、アイテムを部分的にソートされた順序で保持する配列のようなデータ構造です。 これにより、最小のアイテムをすばやく削除でき、ヒーププロパティを維持しながら新しいアイテムを挿入するのはO(lg n)です。 (優先キューのデータ構造の詳細については、 https://xlinux.nist.gov/dads//HTML/priorityque.html を参照してください。)heapq モジュールは、他の可変Pythonシーケンスタイプの上にヒーププロパティを維持しながら、アイテムを追加および削除するための
heappush()
およびheappop()
関数を提供します。 Pythonリストを使用する例を次に示します。(Kevin O'Connorによる寄稿。)
IDLE統合開発環境は、IDLEforkプロジェクト( http://idlefork.sourceforge.net )のコードを使用して更新されました。 最も注目すべき機能は、開発中のコードがサブプロセスで実行されるようになったことです。つまり、手動の
reload()
操作は不要になりました。 IDLEのコアコードは、idlelib
パッケージとして標準ライブラリに組み込まれています。imaplib モジュールは、SSLを介したIMAPをサポートするようになりました。 (PiersLauderとTinoLangeによる寄稿。)
itertools には、MLおよびHaskell言語によって提供されるさまざまな関数に触発された、イテレーターで使用するための便利な関数が多数含まれています。 たとえば、
itertools.ifilter(predicate, iterator)
は、関数predicate()
が True を返すイテレータ内のすべての要素を返し、itertools.repeat(obj, N)
はobj
を返します。 ] N 回。 モジュールには他にも多くの機能があります。 詳細については、パッケージのリファレンスドキュメントを参照してください。 (Raymond Hettingerによる寄稿。)math モジュールの2つの新しい関数、
degrees(rads)
とradians(degs)
は、ラジアンと度の間で変換します。 math.sin()や math.cos()など、 math モジュールの他の関数では、常にラジアンで測定された入力値が必要です。 また、オプションの base 引数が math.log()に追加され、e
および10
以外の基数の対数を簡単に計算できるようになりました。 。 (Raymond Hettingerによる寄稿。)いくつかの新しいPOSIX関数(
getpgid()
、killpg()
、lchown()
、loadavg()
、major()
、makedev()
、minor()
およびmknod()
)が、 os モジュールの下にある posix モジュールに追加されました。 (Gustavo Niemeyer、Geert Jansen、およびDenisSによる寄稿。 オトキダッハ。)os モジュールで、
*stat()
ファミリーの関数がタイムスタンプで秒の小数部をレポートできるようになりました。 このようなタイムスタンプは、 time.time()によって返される値と同様に、浮動小数点数として表されます。テスト中に、タイムスタンプがフロートの場合、一部のアプリケーションが破損することが判明しました。 互換性のために、
stat_result
のタプルインターフェイスを使用する場合、タイムスタンプは整数として表されます。 名前付きフィールド(Python 2.2で最初に導入された機能)を使用する場合、フロートの戻り値を有効にするためにos.stat_float_times()
が呼び出されない限り、タイムスタンプは整数として表されます。Python 2.4では、デフォルトが常にfloatを返すように変更されます。
アプリケーション開発者は、浮動小数点タイムスタンプに直面したときにすべてのライブラリが適切に機能する場合、またはタプルAPIを使用する場合にのみ、この機能を有効にする必要があります。 この機能を使用する場合は、使用ごとに有効にするのではなく、アプリケーションレベルで有効にする必要があります。
optparse モジュールには、オプション値を特定のPythonタイプに変換し、使用法メッセージを自動的に生成するコマンドライン引数用の新しいパーサーが含まれています。 詳細については、次のセクションを参照してください。
古くて文書化されていない
linuxaudiodev
モジュールは非推奨になり、 ossaudiodev という名前の新しいバージョンが追加されました。 OSSサウンドドライバーはLinux以外のプラットフォームでも使用できるため、モジュールの名前が変更されました。また、インターフェイスもさまざまな方法で整理され、最新の状態になっています。 (GregWardとNicholasFitzRoy-Daleによる寄稿。)新しい platform モジュールには、実行しているプラットフォームのさまざまなプロパティを判別しようとする多くの関数が含まれています。 アーキテクチャ、CPUタイプ、Windows OSバージョン、さらにはLinuxディストリビューションバージョンを取得するための関数があります。 (Marc-AndréLemburgによる寄稿)
pyexpat
モジュールによって提供されるパーサーオブジェクトは、オプションで文字データをバッファリングできるようになりました。これにより、文字データハンドラーへの呼び出しが少なくなり、パフォーマンスが向上します。 パーサーオブジェクトのbuffer_text
属性を True に設定すると、バッファリングが有効になります。sample(population, k)
機能がランダムモジュールに追加されました。 Population は、母集団の要素を含むシーケンスまたはxrange
オブジェクトであり、sample()
は、選択した要素を置き換えることなく、母集団から k 要素を選択します。 k は、len(population)
までの任意の値にすることができます。 例えば:random モジュールは、Cで実装された新しいアルゴリズムであるMersenneTwisterを使用するようになりました。 これは、以前のアルゴリズムよりも高速で広範囲に研究されています。
(すべての変更はRaymond Hettingerによって提供されました。)
readline モジュールには、
get_history_item()
、get_current_history_length()
、およびredisplay()
という多くの新機能も追加されました。rexec
およびBastion
モジュールは停止していると宣言されており、それらをインポートしようとすると RuntimeError で失敗します。 新しいスタイルのクラスは、rexec
によって提供される制限された実行環境から抜け出すための新しい方法を提供し、誰もそれらを修正したり、修正する時間に関心がありません。rexec
を使用しているアプリケーションがある場合は、別のものを使用するように書き直してください。(Python 2.2または2.1を使用しても、これらのバージョンの
rexec
モジュールには既知のバグがあるため、アプリケーションの安全性は向上しません。 繰り返す:rexec
を使用している場合は、すぐに使用を中止してください。)rotor
モジュールは、暗号化に使用するアルゴリズムが安全であるとは考えられていないため、非推奨になりました。 暗号化が必要な場合は、個別に入手できるいくつかのAESPythonモジュールのいずれかを使用してください。shutil モジュールは、ファイルまたはディレクトリを新しい場所に再帰的に移動する
move(src, dest)
関数を取得しました。より高度なPOSIXシグナル処理のサポートが signal に追加されましたが、プラットフォーム間で確実に機能させることが不可能であることが判明したため、再び削除されました。
socket モジュールがタイムアウトをサポートするようになりました。 ソケットオブジェクトで
settimeout(t)
メソッドを呼び出して、 t 秒のタイムアウトを設定できます。 t 秒より長くかかる後続のソケット操作は中止され、 socket.timeout 例外が発生します。元のタイムアウトの実装はTimO'Malleyによるものでした。 MichaelGilfixはそれをPython socket モジュールに統合し、長いレビューを通じてそれを導きました。 コードがチェックインされた後、Guido vanRossumはコードの一部を書き直しました。 (これは、共同開発プロセスが実際に行われている良い例です。)
Windowsでは、 socket モジュールにSecureSockets Layer(SSL)サポートが付属するようになりました。
C
PYTHON_API_VERSION
マクロの値は、Pythonレベルでsys.api_version
として公開されるようになりました。 現在の例外は、新しいsys.exc_clear()
関数を呼び出すことでクリアできます。新しい tarfile モジュールでは、 tar 形式のアーカイブファイルの読み取りと書き込みが可能です。 (LarsGustäbelによる寄稿。)
新しい textwrap モジュールには、テキストの段落を含む文字列を折り返すための関数が含まれています。
wrap(text, width)
関数は文字列を受け取り、選択した幅以下の行に分割されたテキストを含むリストを返します。fill(text, width)
関数は、選択した幅以下の行に収まるように再フォーマットされた単一の文字列を返します。 (ご想像のとおり、fill()
はwrap()
の上に構築されています。 例えば:このモジュールには、テキストの折り返し戦略を実際に実装する
TextWrapper
クラスも含まれています。TextWrapper
クラスとwrap()
およびfill()
関数はどちらも、フォーマットを微調整するためのいくつかの追加のキーワード引数をサポートしています。 詳細については、モジュールのドキュメントを参照してください。 (Greg Wardによる寄稿)thread
および threading モジュールには、thread
の何もしない実装を提供するコンパニオンモジュールdummy_thread
および dummy_threading が含まれるようになりました。 ]スレッドがサポートされていないプラットフォーム用のモジュールのインターフェース。 目的は、次のコードを先頭に配置することにより、スレッド対応モジュール(がスレッドに依存しないモジュール)を単純化することです。この例では、
_threading
がモジュール名として使用され、使用されているモジュールが必ずしも実際のスレッドモジュールではないことを明確にしています。 コードは、スレッドがサポートされているかどうかに関係なく、_threading
の関数を呼び出してクラスを使用できるため、 if ステートメントを回避し、コードを少し明確にします。 このモジュールは、マルチスレッドコードをスレッドなしで魔法のように実行することはありません。 別のスレッドが戻るのを待つか、何かをするのを待つコードは、単に永久にハングします。time モジュールの
strptime()
関数は、プラットフォームCライブラリのstrptime()
実装を使用しているため、長い間煩わしく、プラットフォームによっては奇妙なバグが発生することがあります。 Brett Cannonは、純粋なPythonで記述され、すべてのプラットフォームで同じように動作するポータブル実装を提供しました。新しい timeit モジュールは、Pythonコードのスニペットの実行にかかる時間を測定するのに役立ちます。
timeit.py
ファイルは、コマンドラインから直接実行することも、モジュールのTimer
クラスをインポートして直接使用することもできます。 空のUnicode文字列を追加するか、unicode()
関数を使用して、8ビット文字列をUnicodeに変換する方が速いかどうかを判断する短い例を次に示します。Tix
モジュールは、Tixパッケージの現在のバージョンのさまざまなバグ修正と更新を受け取りました。Tkinter
モジュールは、スレッド対応バージョンのTclで動作するようになりました。 Tclのスレッドモデルでは、ウィジェットが作成されたスレッドからのみウィジェットにアクセスする必要があります。 別のスレッドからのアクセスにより、Tclがパニックになる可能性があります。 特定のTclインターフェースでは、Tkinter
は、コマンドをマーシャリングして正しいスレッドに渡し、結果を待つことで、ウィジェットが別のスレッドからアクセスされたときに自動的にこれを回避するようになりました。 他のインターフェースは自動的に処理できませんが、Tkinter
はそのようなアクセスで例外を発生させるので、少なくとも問題を見つけることができます。 この変更の詳細については、 https://mail.python.org/pipermail/python-dev/2002-December/031107.htmlを参照してください。 (MartinvonLöwisによって実装されました。)_tkinter
を介してTclメソッドを呼び出すと、文字列のみが返されなくなりました。 代わりに、Tclが他のオブジェクトを返す場合、それらのオブジェクトは、Pythonに相当するものが存在する場合は変換され、Pythonに相当するものが存在しない場合は_tkinter.Tcl_Obj
オブジェクトでラップされます。 この動作は、tkapp
オブジェクトのwantobjects()
メソッドを介して制御できます。_tkinter
からTkinter
モジュールを使用する場合(ほとんどのTkinterアプリケーションが使用するように)、この機能は常にアクティブになります。 Tkinterは可能な限り文字列の結果を常にPython型に変換するため、互換性の問題は発生しません。非互換性が見つかった場合は、最初の
tkapp
オブジェクトを作成する前に、Tkinter
モジュールのwantobjects
変数をfalseに設定することで、古い動作を復元できます。この変更によって引き起こされた破損は、バグとして報告する必要があります。
UserDict
モジュールには、新しいDictMixin
クラスがあります。このクラスは、最小のマッピングインターフェイスを既に持っているクラスのすべてのディクショナリメソッドを定義します。 これにより、 shelve モジュールのクラスなど、辞書の代わりに使用できる必要のあるクラスの記述が大幅に簡素化されます。ミックスインをスーパークラスとして追加すると、クラスが
__getitem__()
、__setitem__()
、__delitem__()
、およびkeys()
を定義するたびに、完全な辞書インターフェイスが提供されます。 例えば:(Raymond Hettingerによる寄稿。)
xml.dom.minidom のDOM実装は、DOMノードの
toxml()
およびtoprettyxml()
メソッドにオプションのエンコーディング引数を提供することにより、特定のエンコーディングでXML出力を生成できるようになりました。xmlrpclib
モジュールは、PythonのNone
などのnilデータ値を処理するためのXML-RPC拡張機能をサポートするようになりました。 XML-RPC応答のアンマーシャリングでは、常にNil値がサポートされます。None
を含むリクエストを生成するには、Marshaller
インスタンスを作成するときに、 allow_none パラメーターにtrue値を指定する必要があります。新しい
DocXMLRPCServer
モジュールを使用すると、自己文書化XML-RPCサーバーを作成できます。 デモモードで(プログラムとして)実行して、動作を確認します。 WebブラウザでRPCサーバーを指定すると、pydocスタイルのドキュメントが作成されます。 xmlrpclibをサーバーにポイントすると、実際のメソッドを呼び出すことができます。 (Brian Quinlanによる寄稿。)国際化ドメイン名(RFC 3454、3490、3491、および3492)のサポートが追加されました。 「idna」エンコーディングは、Unicodeドメイン名とその名前のASCII互換エンコーディング(ACE)の間で変換するために使用できます。
socket モジュールも拡張され、Unicodeホスト名をCライブラリに渡す前にACEバージョンに透過的に変換するようになりました。
httplib
や ftplib )などのホスト名を処理するモジュールもUnicodeホスト名をサポートします。httplib
は、ドメイン名のACEバージョンを使用してHTTPHost
ヘッダーも送信します。 urllib は、URLのpath
部分がASCIIのみである限り、非ASCIIホスト名のUnicodeURLをサポートします。この変更を実装するために、 stringprep モジュール、
mkstringprep
ツール、およびpunycode
エンコーディングが追加されました。
日付/時刻タイプ
タイムスタンプの表現に適した日付と時刻のタイプが datetime モジュールとして追加されました。 これらのタイプは、さまざまなカレンダーや多くの高度な機能をサポートしておらず、時間を表す基本に固執しています。
3つの主要なタイプは次のとおりです。date
、日、月、および年を表します。 時間、時、分、秒で構成されます。 datetime には、date
と time の両方のすべての属性が含まれています。 2つの時点の違いを表すtimedelta
クラスもあり、タイムゾーンロジックは抽象tzinfo
クラスを継承するクラスによって実装されます。
date
および time のインスタンスを作成するには、適切なコンストラクターにキーワード引数を指定します。 datetime.date(year=1972, month=10, day=15)
、またはいくつかのクラスメソッドの1つを使用する。 たとえば、date.today()
クラスメソッドは現在のローカル日付を返します。
作成されると、日付/時刻クラスのインスタンスはすべて不変になります。 オブジェクトからフォーマットされた文字列を生成するには、いくつかの方法があります。
replace()
メソッドを使用すると、date
または datetime インスタンスの1つ以上のフィールドを変更して、新しいインスタンスを返すことができます。
インスタンスを比較、ハッシュ、および文字列に変換できます(結果はisoformat()
の結果と同じです)。 date
インスタンスと datetime インスタンスは、互いに減算して、timedelta
インスタンスに追加できます。 欠落している最大の機能は、文字列を解析してdate
または datetime を取得するための標準ライブラリサポートがないことです。
詳細については、モジュールのリファレンスドキュメントを参照してください。 (Tim Petersによる寄稿。)
optparseモジュール
getopt モジュールは、コマンドライン引数の単純な解析を提供します。 新しい optparse モジュール(元々はOptikという名前)は、Unixの規則に従い、--help
の出力を自動的に作成し、さまざまなオプションに対してさまざまなアクションを実行できる、より複雑なコマンドライン解析を提供します。
まず、OptionParser
のインスタンスを作成し、プログラムのオプションを指定します。
コマンドラインの解析は、parse_args()
メソッドを呼び出すことによって実行されます。
これにより、すべてのオプション値を含むオブジェクトと、残りの引数を含む文字列のリストが返されます。
さまざまな引数を使用してスクリプトを呼び出すと、期待どおりに機能するようになりました。 長さ引数は自動的に整数に変換されることに注意してください。
$ ./python opt.py -i data arg1
<Values at 0x400cad4c: {'input': 'data', 'length': None}>
['arg1']
$ ./python opt.py --input=data --length=4
<Values at 0x400cad2c: {'input': 'data', 'length': 4}>
[]
$
ヘルプメッセージが自動的に生成されます。
$ ./python opt.py --help
usage: opt.py [options]
options:
-h, --help show this help message and exit
-iINPUT, --input=INPUT
set input filename
-lLENGTH, --length=LENGTH
set maximum length of output
$
詳細については、モジュールのドキュメントを参照してください。
Optikは、Getopt SIGの読者からの提案を受けて、GregWardによって作成されました。
Pymalloc:特殊なオブジェクトアロケータ
Vladimir Marangozovによって作成された特殊なオブジェクトアロケータであるPymallocは、Python2.1に追加された機能でした。 Pymallocは、システムmalloc()
よりも高速であり、Pythonプログラムに典型的な割り当てパターンのメモリオーバーヘッドを少なくすることを目的としています。 アロケータは、Cのmalloc()
関数を使用してメモリの大きなプールを取得し、これらのプールからの小さなメモリ要求を実行します。
2.1および2.2では、pymallocは実験的な機能であり、デフォルトでは有効になっていませんでした。 configure スクリプトに--with-pymalloc
オプションを指定して、Pythonをコンパイルするときに明示的に有効にする必要がありました。 2.3では、pymallocがさらに拡張され、デフォルトで有効になりました。 無効にするには、--without-pymalloc
を指定する必要があります。
この変更は、Pythonで記述されたコードに対して透過的です。 ただし、pymallocはC拡張機能のバグを公開する可能性があります。 C拡張モジュールの作成者は、pymallocを有効にしてコードをテストする必要があります。これは、コードが正しくないと、実行時にコアダンプが発生する可能性があるためです。
問題を引き起こす特に一般的なエラーが1つあります。 PythonのCAPIには、以前はCライブラリのmalloc()
およびfree()
のエイリアスであったメモリ割り当て関数がいくつかあります。つまり、誤って不一致の関数を呼び出した場合でも、エラーは発生しません。目立つ。 オブジェクトアロケータが有効になっている場合、これらの関数はmalloc()
およびfree()
のエイリアスではなくなり、メモリを解放するために間違った関数を呼び出すと、コアダンプが発生する可能性があります。 たとえば、メモリが PyObject_Malloc()を使用して割り当てられた場合、free()
ではなく、 PyObject_Free()を使用してメモリを解放する必要があります。 Pythonに含まれているいくつかのモジュールはこれに反し、修正する必要がありました。 同じ問題を抱えるサードパーティのモジュールが他にもあることは間違いありません。
この変更の一環として、メモリを割り当てるための紛らわしい複数のインターフェイスが2つのAPIファミリに統合されました。 一方のファミリに割り当てられたメモリは、もう一方のファミリの関数で操作してはなりません。 メモリのチャンクを割り当てるための1つのファミリと、Pythonオブジェクトを割り当てるための特別な関数の別のファミリがあります。
- 区別されないメモリチャンクを割り当てて解放するには、「rawメモリ」ファミリを使用します: PyMem_Malloc()、 PyMem_Realloc()、および PyMem_Free()。
- 「オブジェクトメモリ」ファミリは、上記のpymallocファシリティへのインターフェイスであり、 PyObject_Malloc()、 PyObject_Realloc()、および[ X207X] PyObject_Free()。
- Pythonオブジェクトを割り当てて解放するには、「オブジェクト」ファミリ PyObject_New()、 PyObject_NewVar()、および PyObject_Del()を使用します。
Tim Petersによる多くの作業のおかげで、2.3のpymallocは、拡張モジュールとインタープリター自体の両方でメモリーの上書きと2倍の解放をキャッチするデバッグ機能も提供します。 このサポートを有効にするには、 configure を--with-pydebug
で実行して、Pythonインタープリターのデバッグバージョンをコンパイルします。
拡張機能の作成者を支援するために、ヘッダーファイルMisc/pymemcompat.h
がソースとともにPython2.3に配布されます。これにより、Python拡張機能は、1.5.2以降の任意のバージョンのPythonに対してコンパイルしながら、メモリ割り当てへの2.3インターフェイスを使用できます。 Pythonのソースディストリビューションからファイルをコピーし、拡張機能のソースにバンドルします。
も参照してください
- https://hg.python.org/cpython/file/default/Objects/obmalloc.c
- pymalloc実装の詳細については、Pythonソースコードのファイル
Objects/obmalloc.c
の先頭にあるコメントを参照してください。 上記のリンクは、python.orgSVNブラウザー内のファイルを指しています。
ビルドとCAPIの変更
PythonのビルドプロセスとCAPIへの変更は次のとおりです。
- ガベージコレクションで使用されるサイクル検出の実装は安定していることが証明されているため、必須になりました。 これなしではPythonをコンパイルできなくなり、
--with-cycle-gc
から configure への切り替えが削除されました。 - Pythonの configure スクリプトの実行時に
--enable-shared
を指定することにより、Pythonを共有ライブラリ(libpython2.3.so
)としてオプションで構築できるようになりました。 (Ondrej Palkovskyによる寄稿。) DL_EXPORT
およびDL_IMPORT
マクロは非推奨になりました。 Python拡張モジュールの初期化関数は、新しいマクロPyMODINIT_FUNC
を使用して宣言する必要がありますが、Pythonコアは通常PyAPI_FUNC
およびPyAPI_DATA
マクロを使用します。- configure スクリプトに
--without-doc-strings
を指定することにより、組み込み関数およびモジュールのdocstringなしでインタープリターをコンパイルできます。 これにより、Pythonは約10 % s mallerで実行可能になりますが、Pythonの組み込みのヘルプを取得できないことも意味します。 (Gustavo Niemeyerによる寄稿。) PyArg_NoArgs()
マクロは非推奨になり、それを使用するコードを変更する必要があります。 Python 2.2以降の場合、メソッド定義テーブルで METH_NOARGS フラグを指定して、引数がないことを通知し、引数のチェックを削除できます。 2.2より前のバージョンのPythonとの互換性が重要な場合、コードは代わりにPyArg_ParseTuple(args, "")
を使用できますが、これは METH_NOARGS を使用するよりも遅くなります。- PyArg_ParseTuple()は、さまざまなサイズの符号なし整数の新しいフォーマット文字を受け入れます。 unsigned char の場合は
B
、 unsigned short int [ X172X]、 unsigned int の場合はI
、 unsigned long long の場合はK
。 PyObject_DelItem(mapping, PyString_New(key))
の省略形として新機能PyObject_DelItemString(mapping, char *key)
が追加されました。- ファイルオブジェクトは、内部文字列バッファーを異なる方法で管理するようになり、必要に応じて指数関数的に増加します。 これにより、
Lib/test/test_bufio.py
のベンチマークテストが大幅に高速化されます(1つの測定によると57秒から1.7秒に)。 - メソッドの PyMethodDef 構造体で METH_CLASS または METH_STATIC フラグを設定することにより、C拡張タイプのクラスメソッドと静的メソッドを定義できるようになりました。
- Pythonには、Expat XMLパーサーのソースコードのコピーが含まれるようになり、システムバージョンまたはExpatのローカルインストールへの依存がなくなりました。
- 拡張機能で型オブジェクトを動的に割り当てる場合は、
__module__
および __ name __ 属性に関連するルールの変更に注意する必要があります。 要約すると、タイプのディクショナリに'__module__'
キーが含まれていることを確認する必要があります。 モジュール名を最終期間に至るまでのタイプ名の一部にすると、目的の効果が得られなくなります。 詳細については、APIリファレンスドキュメントまたはソースをお読みください。
ポート固有の変更
EMXランタイム環境を使用したIBMのOS / 2へのポートのサポートは、メインのPythonソースツリーに統合されました。 EMXは、OS / 2システムAPI上のPOSIXエミュレーションレイヤーです。 EMXのPythonポートは、EMXランタイムによって公開されるすべてのPOSIXのような機能をサポートしようとし、ほとんど成功します。 fork()
および fcntl()は、基礎となるエミュレーション層の制限によって制限されます。 IBMのVisualAgeコンパイラーを使用する標準のOS / 2ポートも、EMXポートのCVSへの統合の一環として、大文字と小文字を区別するインポートセマンティクスのサポートを取得しました。 (Andrew MacIntyreによる寄稿。)
MacOSでは、下位互換性を向上させるために、ほとんどのツールボックスモジュールが弱くリンクされています。 これは、現在のOSバージョンで単一のルーチンが欠落している場合でもモジュールのロードに失敗しないことを意味します。 代わりに、欠落しているルーチンを呼び出すと例外が発生します。 (Jack Jansenによる寄稿)
PythonソースディストリビューションのMisc/RPM/
ディレクトリにあるRPM仕様ファイルが2.3用に更新されました。 (Sean Reifschneiderによる寄稿。)
Pythonで現在サポートされているその他の新しいプラットフォームには、AtheOS( http://www.atheos.cx/ )、GNU / Hurd、OpenVMSなどがあります。
その他の変更と修正
いつものように、ソースツリー全体に散らばっている他の多くの改善とバグ修正がありました。 CVS変更ログを検索すると、Python 2.2と2.3の間で523個のパッチが適用され、514個のバグが修正されていることがわかります。 どちらの数値も過小評価される可能性があります。
より注目すべき変更点は次のとおりです。
PYTHONINSPECT 環境変数が設定されている場合、Pythonインタープリターは、Pythonが -i で呼び出されたかのように、Pythonプログラムの実行後に対話型プロンプトに入ります。オプション。 環境変数は、Pythonインタープリターを実行する前に設定することも、Pythonプログラムによって実行の一部として設定することもできます。
regrtest.py
スクリプトは、「 foo を除くすべてのリソース」を許可する方法を提供するようになりました。-u
オプションに渡されるリソース名の前に、「このリソースを削除する」ことを意味するハイフン('-'
)を付けることができるようになりました。 たとえば、オプション '-uall,-bsddb
'を使用して、bsddb
を除くすべてのリソースの使用を有効にすることができます。ドキュメントの作成に使用されるツールは、UnixだけでなくCygwinでも機能するようになりました。
SET_LINENO
オペコードは削除されました。 昔、このオペコードは、トレースバックで行番号を生成し、トレース機能( pdb など)をサポートするために必要でした。 Python 1.5以降、トレースバックの行番号は、「python-O」で機能する別のメカニズムを使用して計算されています。 Python 2.3の場合、Michael Hudsonは、トレース関数をいつ呼び出すかを決定するために同様のスキームを実装し、SET_LINENO
の必要性を完全に排除しました。-O なしでPythonを実行するとわずかに速度が上がることを除けば、Pythonコードとの結果として生じる違いを検出することは困難です。
フレームオブジェクトの
f_lineno
フィールドにアクセスするC拡張機能は、代わりにPyCode_Addr2Line(f->f_code, f->f_lasti)
を呼び出す必要があります。 これには、以前のバージョンのPythonの「python-O」でコードを希望どおりに機能させるという追加の効果があります。気の利いた新機能は、トレース関数がフレームオブジェクトの
f_lineno
属性に割り当てられるようになり、次に実行される行を変更できることです。 この新機能を利用して、jump
コマンドが pdb デバッガーに追加されました。 (Richie Hindleによって実装されました。)
Python2.3への移植
このセクションでは、コードの変更が必要になる可能性のある前述の変更を一覧表示します。
yield は常にキーワードになりました。 コードで変数名として使用されている場合は、別の名前を選択する必要があります。
文字列 X および Y の場合、 X が複数の文字の長さである場合に
X in Y
が機能するようになりました。int()型コンストラクターは、文字列または浮動小数点数が大きすぎて整数に収まらない場合に、 OverflowError を発生させる代わりに、長整数を返すようになりました。
8ビット文字を含むUnicode文字列がある場合は、ファイルの先頭にコメントを追加して、ファイルのエンコーディング(UTF-8、Latin-1など)を宣言する必要があります。 詳細については、セクション PEP 263:ソースコードエンコーディングを参照してください。
_tkinter
を介してTclメソッドを呼び出すと、文字列のみが返されなくなりました。 代わりに、Tclが他のオブジェクトを返す場合、それらのオブジェクトは、Pythonに相当するものが存在する場合は変換され、Pythonに相当するものが存在しない場合は_tkinter.Tcl_Obj
オブジェクトでラップされます。0xffffffff
などの大きな8進数および16進数のリテラルは、 FutureWarning をトリガーするようになりました。 現在、これらは32ビットの数値として格納され、負の値になりますが、Python 2.4では、正の長整数になります。この警告を修正する方法はいくつかあります。 本当に正の数が必要な場合は、リテラルの最後に
L
を追加するだけです。 下位ビットが設定された32ビット整数を取得しようとしていて、以前に~(1 << 31)
などの式を使用したことがある場合は、すべてのビットを設定して開始し、目的の上位ビットをクリアするのがおそらく最も明確です。 たとえば、トップビット(ビット31)だけをクリアするには、0xffffffffL &~(1L<<31)
と書くことができます。__debug__
に割り当てることで、アサーションを無効にすることはできなくなりました。Distutils
setup()
関数は、 depends などのさまざまな新しいキーワード引数を取得しました。 不明なキーワードが渡されると、古いバージョンのDistutilsは中止されます。 解決策は、setup.py
に新しいget_distutil_options()
関数が存在するかどうかを確認し、それらをサポートするバージョンのDistutilsでのみ新しいキーワードを使用することです。None
を変数名として使用すると、 SyntaxWarning 警告が表示されるようになりました。Pythonに含まれているモジュールによって定義された拡張タイプの名前には、モジュールと、タイプ名の前に
'.'
が含まれるようになりました。
謝辞
著者は、この記事のさまざまなドラフトについて提案、修正、および支援を提供してくれた次の人々に感謝します:Jeff Bauer、Simon Brunning、Brett Cannon、Michael Chermside、Andrew Dalke、Scott David Daniels、FredL。 ドレイク・ジュニア、デビッド・フレイザー、ケリー・ガーバー、レイモンド・ヘッティンガー、マイケル・ハドソン、クリス・ランバート、デトレフ・ラナート、マーティン・フォン・レーウィス、アンドリュー・マッキンタイア、ラロ・マーティンズ、チャド・ネッツァー、グスタボ・ニーマイヤー、ニール・ノーウィッツ、ハンス・ノワク、クリス・リーディ、フランチェスコ・リチャーディ、Vinay Sajip、Neil Schemenauer、Roman Suzi、Jason Tishler、Just vanRossum。