Python 2.0の新機能—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/whatsnew/2.0
移動先:案内検索

Python2.0の新機能

著者
午前 KuchlingとMosheZadka

序章

Pythonの新しいリリースであるバージョン2.0が2000年10月16日にリリースされました。 この記事では、2.0のエキサイティングな新機能について説明し、その他の便利な変更点をいくつか取り上げ、コードの書き換えが必要になる可能性のある互換性のない変更点をいくつか指摘します。

Pythonの開発はリリース間で完全に停止することはなく、バグ修正と改善の着実な流れが常に提出されています。 多数のマイナーな修正、いくつかの最適化、追加のdocstring、およびより優れたエラーメッセージが2.0に組み込まれました。 それらすべてをリストすることは不可能ですが、それらは確かに重要です。 完全なリストを確認したい場合は、公開されているCVSログを参照してください。 この進歩は、PythonLabsで働いている5人の開発者が、バグの修正に日々費やすために報酬を受け取っていることと、SourceForgeへの移行によってコミュニケーションが改善されたことによるものです。


Python 1.6はどうですか?

Python 1.6は、契約上の義務であるPythonリリースと考えることができます。 コア開発チームが2000年5月にCNRIを離れた後、CNRIは、CNRIで実行されたPythonでのすべての作業を含む1.6リリースの作成を要求しました。 したがって、Python 1.6は、2000年5月現在のCVSツリーの状態を表しており、最も重要な新機能はUnicodeのサポートです。 もちろん、開発は5月以降も続けられたため、1.6ツリーにはPython2.0との上位互換性を確保するためのいくつかの修正が加えられました。 したがって、1.6はPythonの進化の一部であり、サイドブランチではありません。

では、Python 1.6に多くの関心を払う必要がありますか? おそらくそうではありません。 1.6finalと2.0beta1のリリースは同じ日(2000年9月5日)に行われ、Python2.0を1か月ほどで完成させる予定です。 保守するアプリケーションがある場合、1.6に移行して修正し、2.0に移行して1か月以内にもう一度破損することにはほとんど意味がないようです。 2.0に直行する方が良いでしょう。 5月から9月の間に多くの作業が行われたため、このドキュメントで説明されている非常に興味深い機能のほとんどは2.0のみです。


新しい開発プロセス

Python 2.0での最も重要な変更は、コードではなく、Pythonの開発方法です。2000年5月、Python開発者は、SourceForgeが提供するツールを使用して、ソースコードの保存、バグレポートの追跡、キューの管理を開始しました。パッチ提出の。 Python 2.0のバグを報告したりパッチを送信したりするには、 https://sourceforge.net/projects/python/にあるPythonのプロジェクトページから入手できるバグ追跡ツールとパッチマネージャーツールを使用します。

現在SourceForgeでホストされているサービスの中で最も重要なものは、Pythonのソースコードを含むバージョン管理されたリポジトリであるPythonCVSツリーです。 以前は、CVSツリーへの書き込みアクセス権を持っていた人は約7人で、すべてのパッチは、この短いリストの1人が検査してチェックインする必要がありました。 明らかに、これはあまりスケーラブルではありませんでした。 CVSツリーをSourceForgeに移動することで、より多くの人に書き込みアクセスを許可することが可能になりました。 2000年9月の時点で、27人が変更をチェックインでき、4倍に増加しました。 これにより、コア開発者の小さなグループでフィルタリングする必要がある場合に試行されない大規模な変更が可能になります。 たとえば、ある日、Peter Schneider-Kampは、K&R Cの互換性を落とし、PythonのCソースをANSICに変換するために頭に浮かびました。 python-devメーリングリストで承認を得た後、彼は約1週間続く一連のチェックインを開始し、他の開発者が協力して作業を完了しました。 書き込みアクセス権を持つ人が5人しかいなかったとしたら、おそらくそのタスクは「素晴らしいが、必要な時間と労力の価値がない」と見なされ、決して実行されなかったでしょう。

SourceForgeのサービスの使用への移行により、開発速度が著しく向上しました。 パッチは、元の送信者以外の人によって送信、コメント、改訂され、パッチをチェックインする価値があると見なされるまで、人の間を行き来するようになりました。 バグは1つの中央の場所で追跡され、特定の担当者に割り当てて修正することができます。また、未解決のバグの数をカウントして進行状況を測定できます。 これにはコストがかかりました。開発者は、処理する電子メールが増え、従うメーリングリストが増え、新しい環境用に特別なツールを作成する必要がありました。 たとえば、SourceForgeは、まったく役に立たないデフォルトのパッチとバグ通知の電子メールメッセージを送信するため、Ka-Ping Yeeは、より有用なメッセージを送信するHTMLスクリーンスクレイパーを作成しました。

コードの追加が簡単なため、準備が整う前にコードをチェックインしたり、開発者グループから明確な同意を得られなかったりするなど、初期の大きな問題がいくつか発生しました。 出現した承認プロセスは、Apacheグループで使用されているものと多少似ています。 開発者は、パッチに+ 1、+ 0、-0、または-1を投票できます。 +1と-1は受け入れまたは拒否を示し、+ 0と-0は、開発者が変更にほとんど無関心であることを意味しますが、わずかに正または負の傾斜があります。 Apacheモデルからの最も重要な変更は、投票が本質的に助言であり、Benevolent Dictator ForLifeステータスを持つGuidovanRossumに一般的な意見が何であるかを知らせることです。 コミュニティが彼に同意しなくても、彼は投票の結果を無視し、変更を承認または拒否することができます。

実際のパッチを作成することは、新しい機能を追加するための最後のステップであり、通常、優れたデザインを考え出すという以前のタスクと比較して簡単です。 新機能の議論はしばしば長いメーリングリストスレッドに爆発する可能性があり、議論をフォローするのが難しくなり、誰もpython-devへのすべての投稿を読むことができません。 したがって、インターネットRFCプロセスをモデルにしたPython拡張提案(PEP)を作成するために、比較的正式なプロセスが設定されています。 PEPは、提案された新機能を説明するドラフトドキュメントであり、コミュニティが提案を受け入れるか拒否するかで合意に達するまで継続的に改訂されます。 PEP 1 の紹介からの引用、「PEPの目的とガイドライン」:

PEPはPythonEnhancementProposalの略です。 PEPは、Pythonコミュニティに情報を提供したり、Pythonの新機能を説明したりする設計ドキュメントです。 PEPは、機能の簡潔な技術仕様と機能の理論的根拠を提供する必要があります。

PEPは、新しい機能を提案したり、問題に関するコミュニティの意見を収集したり、Pythonに取り入れられた設計上の決定を文書化したりするための主要なメカニズムになる予定です。 PEPの作成者は、コミュニティ内でコンセンサスを構築し、反対意見を文書化する責任があります。


PEPの編集プロセス、スタイル、および形式の詳細については、 PEP 1 の残りの部分をお読みください。 PEPはSourceForgeのPythonCVSツリーに保持されますが、Python 2.0ディストリビューションの一部ではなく、 https://www.python.org/dev/peps/[X186XからHTML形式で入手することもできます。 ]。 2000年9月の時点で、 PEP 201 の「LockstepIteration」からPEP225の「Elementwise / ObjectwiseOperators」までの25のPEPSがあります。


Unicode

Python 2.0の最大の新機能は、新しい基本的なデータ型であるUnicode文字列です。 Unicodeは、ASCIIで使用される8ビットの数字の代わりに16ビットの数字を使用して文字を表します。つまり、65,536の異なる文字をサポートできます。

Unicodeサポートの最終的なインターフェイスは、python-devメーリングリストでの数え切れないほどの嵐の議論を通じて到達し、Fredrik LundhによるUnicode文字列型の実装に基づいて、ほとんどがMarc-AndréLemburgによって実装されました。 インターフェイスの詳細な説明は、 PEP 100 、「PythonUnicode統合」として作成されました。 この記事では、Unicodeインターフェースに関する最も重要なポイントについて簡単に説明します。

Pythonソースコードでは、Unicode文字列はu"string"として記述されます。 任意のUnicode文字は、新しいエスケープシーケンス\uHHHHを使用して書き込むことができます。ここで、 HHHH は、0000からFFFFまでの4桁の16進数です。 既存の\xHHHHエスケープシーケンスも使用でき、8進エスケープは\777で表されるU + 01FFまでの文字に使用できます。

Unicode文字列は、通常の文字列と同様に、不変のシーケンスタイプです。 それらはインデックス付けおよびスライスできますが、その場で変更することはできません。 Unicode文字列には、目的のエンコーディングで8ビット文字列を返すencode( [encoding] )メソッドがあります。 エンコーディングは、'ascii''utf-8''iso-8859-1'などの文字列によって名前が付けられます。 コーデックAPIは、Pythonプログラム全体で使用できる新しいエンコーディングを実装および登録するために定義されています。 エンコーディングが指定されていない場合、デフォルトのエンコーディングは通常7ビットASCIIですが、カスタマイズされたバージョンのsite.pysys.setdefaultencoding(encoding)関数を呼び出すことにより、Pythonインストール用に変更できます。

8ビット文字列とUnicode文字列を組み合わせると、デフォルトのASCIIエンコーディングを使用して、常にUnicodeに強制されます。 'a' + u'bc'の結果はu'abc'です。

新しい組み込み関数が追加され、Unicodeをサポートするように既存の組み込み関数が変更されました。

  • unichr(ch)は、文字 ch を含む1文字の長さのUnicode文字列を返します。
  • ord(u)u は1文字の通常の文字列またはUnicode文字列)は、文字の番号を整数として返します。
  • unicode(string [, encoding]  [, errors] )は、8ビット文字列からUnicode文字列を作成します。 encodingは、使用するエンコーディングに名前を付ける文字列です。 errorsパラメーターは、現在のエンコードに対して無効な文字の処理を指定します。 'strict'を値として渡すと、エンコードエラーで例外が発生し、'ignore'はエラーをサイレントに無視し、'replace'は公式の置換文字であるU + FFFDを使用します。 、問題が発生した場合。
  • execステートメント、およびeval()getattr()setattr()などのさまざまな組み込み関数も、通常の文字列だけでなくUnicode文字列も受け入れます。 (これを修正するプロセスで一部の組み込み関数が欠落している可能性があります。文字列を受け入れるがUnicode文字列をまったく受け入れない組み込み関数を見つけた場合は、バグとして報告してください。)

新しいモジュール unicodedata は、Unicode文字プロパティへのインターフェイスを提供します。 たとえば、unicodedata.category(u'A')は、2文字の文字列「Lu」を返します。「L」は文字であることを示し、「u」は大文字であることを示します。 unicodedata.bidirectional(u'\u0660')は「AN」を返します。これはU + 0660がアラビア数字であることを意味します。

コーデックモジュールには、既存のエンコーディングを検索して新しいエンコーディングを登録するための関数が含まれています。 新しいエンコーディングを実装する場合を除いて、ほとんどの場合、codecs.lookup(encoding)関数を使用します。この関数は、4要素のタプル(encode_func, decode_func, stream_reader, stream_writer)を返します。

  • encode_func は、Unicode文字列を受け取り、2タプル(string, length)を返す関数です。 string は、指定されたエンコーディングに変換されたUnicode文字列の一部(おそらくすべて)を含む8ビット文字列です。 length は、Unicode文字列のどれだけが変換されたかを示します。
  • decode_funcencode_func の反対であり、8ビット文字列を取り、結果のUnicode文字列 ustring で構成される2タプル(ustring, length)を返します。 ]および整数 length は、8ビット文字列のどれだけが消費されたかを示します。
  • stream_reader は、ストリームからの入力のデコードをサポートするクラスです。 stream_reader(file_obj)は、read()readline()、およびreadlines()メソッドをサポートするオブジェクトを返します。 これらのメソッドはすべて、指定されたエンコーディングから変換され、Unicode文字列を返します。
  • stream_writer も同様に、ストリームへの出力のエンコードをサポートするクラスです。 stream_writer(file_obj)は、write()およびwritelines()メソッドをサポートするオブジェクトを返します。 これらのメソッドはUnicode文字列を想定しており、出力時に指定されたエンコーディングに変換します。

たとえば、次のコードはUnicode文字列をファイルに書き込み、UTF-8としてエンコードします。

import codecs

unistr = u'\u0660\u2000ab ...'

(UTF8_encode, UTF8_decode,
 UTF8_streamreader, UTF8_streamwriter) = codecs.lookup('UTF-8')

output = UTF8_streamwriter( open( '/tmp/output', 'wb') )
output.write( unistr )
output.close()

次のコードは、ファイルからUTF-8入力を読み取ります。

input = UTF8_streamreader( open( '/tmp/output', 'rb') )
print repr(input.read())
input.close()

Unicode対応の正規表現は、 re モジュールを介して利用できます。このモジュールには、Secret LabsABのFredrikLundhによって作成されたSREと呼ばれる新しい基本的な実装があります。

-Uコマンドラインオプションが追加され、Pythonコンパイラがすべての文字列リテラルをUnicode文字列リテラルとして解釈するようになりました。 Pythonの将来のバージョンでは、8ビット文字列のサポートが終了し、Unicode文字列のみが提供される可能性があるため、これはPythonコードのテストと将来の保証に使用することを目的としています。


リスト内包表記

リストはPythonの主力データ型であり、多くのプログラムはある時点でリストを操作します。 リストに対する2つの一般的な操作は、リストをループして、特定の基準を満たす要素を選択するか、各要素に何らかの関数を適用することです。 たとえば、文字列のリストが与えられた場合、特定のサブ文字列を含むすべての文字列を引き出したり、各行から末尾の空白を削除したりできます。

既存の map()および filter()関数をこの目的に使用できますが、引数の1つとして関数が必要です。 直接渡すことができる既存の組み込み関数がある場合はこれで問題ありませんが、ない場合は、必要な作業を行うために小さな関数を作成する必要があります。Pythonのスコープ規則により、小さな関数が必要な場合は結果が醜くなります。追加情報。 前の段落の最初の例を見て、特定の部分文字列を含むリスト内のすべての文字列を見つけます。 あなたはそれをするために以下を書くことができます:

# Given the list L, make a list of all strings
# containing the substring S.
sublist = filter( lambda s, substring=S:
                     string.find(s, substring) != -1,
                  L)

Pythonのスコープ規則により、 lambda 式によって作成された無名関数が検索対象のサブストリングを認識できるように、デフォルトの引数が使用されます。 リスト内包表記はこれをよりクリーンにします:

sublist = [ s for s in L if string.find(s, S) != -1 ]

リスト内包表記の形式は次のとおりです。

[ expression for expr in sequence1
             for expr2 in sequence2 ...
             for exprN in sequenceN
             if condition ]

forin句には、繰り返されるシーケンスが含まれています。 シーケンスは並列に繰り返されるのではなく、左から右に繰り返されるため、同じ長さである必要はありません。 これについては、次の段落で詳しく説明します。 生成されたリストの要素は、 expression の連続する値になります。 最後のif句はオプションです。 存在する場合、は、条件が真の場合にのみ評価され、結果に追加されます。

セマンティクスを非常に明確にするために、リスト内包表記は次のPythonコードと同等です。

for expr1 in sequence1:
    for expr2 in sequence2:
    ...
        for exprN in sequenceN:
             if (condition):
                  # Append the value of
                  # the expression to the
                  # resulting list.

これは、複数のforin句がある場合、結果のリストはすべてのシーケンスの長さの積に等しくなることを意味します。 長さ3のリストが2つある場合、出力リストの長さは9要素です。

seq1 = 'abc'
seq2 = (1,2,3)
>>> [ (x,y) for x in seq1 for y in seq2]
[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1),
('c', 2), ('c', 3)]

Pythonの文法にあいまいさが生じるのを避けるために、 expression がタプルを作成している場合は、括弧で囲む必要があります。 以下の最初のリスト内包表記は構文エラーですが、2番目のリスト内包表記は正しいです。

# Syntax error
[ x,y for x in seq1 for y in seq2]
# Correct
[ (x,y) for x in seq1 for y in seq2]

リスト内包表記の考え方は、もともと関数型プログラミング言語Haskell( https://www.haskell.org )に由来しています。 Greg Ewingは、それらをPythonに追加することについて最も効果的に主張し、最初のリスト内包表記パッチを作成しました。その後、python-devメーリングリストで無限に議論され、SkipMontanaroによって最新の状態に保たれました。


拡張割り当て

長い間要望されていたもう1つの機能である、拡張代入演算子がPython2.0に追加されました。 拡張代入演算子には、+=-=*=などがあります。 たとえば、ステートメントa += 2は、変数aの値を2ずつインクリメントします。これは、少し長いa = a + 2に相当します。

サポートされている代入演算子の完全なリストは、+=-=*=/=%=**=&=|=^=>>=、および<<=。 Pythonクラスは、__iadd__()__isub__()などの名前のメソッドを定義することにより、拡張代入演算子をオーバーライドできます。 たとえば、次のNumberクラスは数値を格納し、+ =を使用してインクリメントされた値で新しいインスタンスを作成することをサポートします。

class Number:
    def __init__(self, value):
        self.value = value
    def __iadd__(self, increment):
        return Number( self.value + increment)

n = Number(5)
n += 3
print n.value

__iadd__()特殊メソッドは、インクリメントの値で呼び出され、適切に変更された値で新しいインスタンスを返す必要があります。 この戻り値は、左側の変数の新しい値としてバインドされます。

拡張代入演算子は、Cプログラミング言語で最初に導入され、 awk 、C ++、Java、Perl、PHPなどのほとんどのC派生言語もサポートしています。 拡張割り当てパッチは、ThomasWoutersによって実装されました。


文字列メソッド

これまで、文字列操作機能は string モジュールにありました。これは通常、Cで記述されたstropモジュールのフロントエンドでした。 Unicodeの追加は、stropモジュールに問題を引き起こしました。これは、8ビットまたはUnicode文字列を受け入れるために、すべての関数を書き直す必要があるためです。 string.replace()などの関数の場合、3つの文字列引数を取ります。これは、8つの可能な順列と、それに対応する複雑なコードを意味します。

代わりに、Python 2.0は問題を文字列型にプッシュし、8ビット文字列とUnicode文字列の両方のメソッドを通じて文字列操作機能を利用できるようにします。

>>> 'andrew'.capitalize()
'Andrew'
>>> 'hostname'.replace('os', 'linux')
'hlinuxtname'
>>> 'moshe'.find('sh')
2

変更されていないことの1つは、注目に値するエイプリルフールのジョークにもかかわらず、Python文字列は不変であるということです。 したがって、文字列メソッドは新しい文字列を返し、操作対象の文字列を変更しません。

古い string モジュールは、下位互換性のためにまだ存在していますが、ほとんどの場合、新しい文字列メソッドのフロントエンドとして機能します。

2.0より前のバージョンでは類似点がない2つのメソッドは、かなり長い間JPythonに存在していましたが、startswith()endswith()です。 s.startswith(t)s[:len(t)] == tと同等であり、s.endswith(t)s[-len(t):] == tと同等です。

特筆に値するもう1つの方法は、join()です。 文字列のjoin()メソッドは、文字列のシーケンスである1つのパラメータを受け取り、引数が逆になっている古い string モジュールのstring.join()関数と同等です。 つまり、s.join(seq)は古いstring.join(seq, s)と同等です。


サイクルのガベージコレクション

PythonのC実装は、参照カウントを使用してガベージコレクションを実装します。 すべてのPythonオブジェクトは、それ自体を指す参照の数のカウントを維持し、参照が作成または破棄されるときにカウントを調整します。 参照カウントがゼロに達すると、オブジェクトにアクセスするにはオブジェクトへの参照が必要になるため、オブジェクトにアクセスできなくなります。カウントがゼロの場合、参照は存在しなくなります。

参照カウントにはいくつかの快適な特性があります。理解と実装が簡単で、結果として得られる実装は移植性があり、かなり高速で、独自のメモリ処理スキームを実装する他のライブラリとうまく反応します。 参照カウントの主な問題は、オブジェクトにアクセスできなくなったことに気付かないことがあり、その結果、メモリリークが発生することです。 これは、参照のサイクルがある場合に発生します。

可能な限り単純なサイクルである、それ自体への参照を持つクラスインスタンスについて考えてみます。

instance = SomeClass()
instance.myself = instance

上記の2行のコードが実行された後、instanceの参照カウントは2になります。 1つの参照は'instance'という名前の変数からのものであり、もう1つはインスタンスのmyself属性からのものです。

次のコード行がdel instanceの場合、どうなりますか? instanceの参照カウントは1減少するため、参照カウントは1になります。 myself属性の参照はまだ存在します。 ただし、インスタンスはPythonコードからアクセスできなくなり、削除される可能性があります。 複数のオブジェクトが相互に参照している場合、それらがサイクルに参加し、すべてのオブジェクトがリークする可能性があります。

Python 2.0は、アクセスできないサイクルを探し、関連するオブジェクトを削除するサイクル検出アルゴリズムを定期的に実行することで、この問題を修正します。 新しい gc モジュールは、ガベージコレクションを実行し、デバッグ統計を取得し、コレクターのパラメーターを調整するための関数を提供します。

サイクル検出アルゴリズムの実行には時間がかかるため、追加のオーバーヘッドが発生します。 2.0の使用からサイクルコレクションの経験を積んだ後、Python2.1は注意深く調整することでオーバーヘッドを最小限に抑えることができると期待されています。 これのベンチマークはトリッキーであり、プログラムがオブジェクトを作成および破棄する頻度に大きく依存するため、パフォーマンスがどれだけ失われるかはまだ明らかではありません。 configure [を実行するときに--without-cycle-gcスイッチを指定することで、Pythonのコンパイル時にサイクルの検出を無効にすることができます。速度がわずかに低下する余裕がない場合や、サイクルコレクションにバグがあると思われる場合です。 X223X]スクリプト。

何人かの人々がこの問題に取り組み、解決に貢献しました。 サイクル検出アプローチの初期の実装は、TobyKelseyによって作成されました。 現在のアルゴリズムは、CNRIへの訪問中にEric Tiedemannによって提案され、Guido vanRossumとNeilSchemenauerは、後にNeilによって統合された2つの異なる実装を作成しました。 他の多くの人々が途中で提案をしました。 python-devメーリングリストの2000年3月のアーカイブには、特に「Pythonのリファレンスサイクルコレクション」および「Finalizationagain」というタイトルのスレッドで、関連する議論のほとんどが含まれています。


その他の主要な変更

Pythonの構文と組み込み関数にさまざまな小さな変更が加えられました。 いずれの変更も非常に広範囲にわたるものではありませんが、便利です。

マイナーな言語変更

新しい構文により、引数のタプルやキーワード引数の辞書を使用して特定の関数を呼び出すことがより便利になります。 Python 1.5以前では、apply()組み込み関数を使用します。apply(f, args, kw)は、引数タプル args と辞書 kw のキーワード引数。 apply()は2.0でも同じですが、Greg Ewingのパッチのおかげで、f(*args, **kw)は、同じ効果を実現するためのより短く明確な方法です。 この構文は、関数を定義するための構文と対称的です。

def f(*args, **kw):
    # args is a tuple of positional args,
    # kw is a dictionary of keyword args
    ...

printステートメントは、Unixシェルのリダイレクト演算子と同様に、printの後に>> fileを続けることで、出力をファイルのようなオブジェクトに向けることができるようになりました。 以前は、ファイルのようなオブジェクトのwrite()メソッドを使用する必要がありましたが、printの利便性と単純さが欠けているか、sys.stdoutに新しい値を割り当てることができました。 ]次に、古い値を復元します。 出力を標準エラーに送信する場合は、次のように記述する方がはるかに簡単です。

print >> sys.stderr, "Warning: action field not supplied"

モジュールは、構文import module as nameまたはfrom module import name as othernameを使用して、インポート時に名前を変更できるようになりました。 パッチはThomasWoutersによって提出されました。

%演算子を使用すると、新しいフォーマットスタイルを使用できます。 '%r'は、引数の repr()を挿入します。 これは、対称性の考慮事項からも追加されました。今回は、引数の str()を挿入する既存の '%s'形式スタイルとの対称性のためです。 たとえば、'%r %s' % ('abc', 'abc')は、'abc' abcを含む文字列を返します。

以前は、Pythonの組み込み in 演算子をオーバーライドし、カスタムバージョンを実装するクラスを実装する方法はありませんでした。 obj in seqは、 obj がシーケンス seq に存在する場合にtrueを返します。 Pythonは、 obj が見つかるか、 IndexError が検出されるまで、シーケンスのすべてのインデックスを試行するだけでこれを計算します。 Moshe Zadkaは、inのカスタム実装を提供するための__contains__()マジックメソッドを追加するパッチを提供しました。 さらに、Cで記述された新しい組み込みオブジェクトは、シーケンスプロトコルの新しいスロットを介してinがそれらに対して何を意味するかを定義できます。

以前のバージョンのPythonは、オブジェクトを削除するために再帰的アルゴリズムを使用していました。 深くネストされたデータ構造により、インタープリターがCスタックをいっぱいにしてクラッシュする可能性があります。 Christian Tismerは、この問題を修正するために削除ロジックを書き直しました。 関連する注記として、再帰オブジェクトの比較は無限に再帰し、クラッシュしました。 Jeremy Hyltonは、クラッシュしないようにコードを書き直し、代わりに有用な結果を生成しました。 たとえば、このコードの後:

a = []
b = []
a.append(a)
b.append(b)

2つの再帰的データ構造は同型であるため、比較a==bはtrueを返します。 この実装に至るまでの議論といくつかの有用な関連リンクについては、python-devメーリングリストの2000年4月のアーカイブにあるスレッド「trashcanandPR#7」を参照してください。 比較によっても例外が発生する可能性があることに注意してください。 以前のバージョンのPythonでは、cmp(a,b)などの比較操作では、ユーザー定義の__cmp__()メソッドでエラーが発生した場合でも、結果として生じる例外が単にサイレントに飲み込まれるため、常に回答が生成されていました。

PythonをItaniumプロセッサ上の64ビットWindowsに移植する作業は、主にActiveStateのTrentMickによって行われました。 (紛らわしいことに、Win64ではsys.platform'win32'のままです。移植を容易にするために、MS Visual C ++はItaniumではコードを32ビットとして扱うようです。)PythonWinはWindowsCEもサポートしています。 詳細については、 http://pythonce.sourceforge.net/のPythonCEページを参照してください。

もう1つの新しいプラットフォームはDarwin / MacOSXです。 それの最初のサポートはPython2.0にあります。 「configure–with-dyld –with-suffix = .x」を指定すると、動的ロードが機能します。 詳細な手順については、PythonソースディストリビューションのREADMEを参照してください。

Pythonの疣贅の1つである、変数に値が割り当てられる前にコードがローカル変数を参照するときにしばしば混乱する NameError 例外を軽減する試みが行われました。 たとえば、次のコードは、1.5.2と2.0の両方でprintステートメントで例外を発生させます。 1.5.2では NameError 例外が発生し、2.0では新しい UnboundLocalError 例外が発生します。 UnboundLocalErrorNameError のサブクラスであるため、 NameError が発生することを期待する既存のコードは引き続き機能します。

def f():
    print "i=",i
    i = i + 1
f()

TabErrorIndentationError の2つの新しい例外が導入されました。 これらは両方とも SyntaxError のサブクラスであり、Pythonコードが不適切にインデントされていることが判明した場合に発生します。


組み込み関数の変更

新しいビルトインzip(seq1, seq2, ...)が追加されました。 zip()は、各タプルに各引数シーケンスのi番目の要素が含まれているタプルのリストを返します。 zip()map(None, seq1, seq2)の違いは、シーケンスがすべて同じでない場合、 map()がシーケンスをNoneでパディングすることです。 zip()は、返されたリストを最短の引数シーケンスの長さに切り捨てます。

int()およびlong()関数は、最初の引数が文字列の場合、オプションの「ベース」パラメーターを受け入れるようになりました。 int('123', 10)は123を返し、int('123', 16)は291を返します。 int(123, 16)は、 TypeError 例外を発生させ、「明示的な基数を持つ非文字列を変換できません」というメッセージを表示します。

より詳細なバージョン情報を保持する新しい変数が sys モジュールに追加されました。 sys.version_infoはタプル(major, minor, micro, level, serial)です。たとえば、仮想の2.0.1beta1では、sys.version_info(2, 0, 1, 'beta', 1)になります。 level は、最終リリースの"alpha""beta""final"などの文字列です。

辞書には奇妙な新しいメソッドsetdefault(key, default)があり、これは既存のget()メソッドと同様に動作します。 ただし、キーが欠落している場合、setdefault()get()と同様に default の値を返し、の値として辞書に挿入します。キー。 したがって、次のコード行は次のとおりです。

if dict.has_key( key ): return dict[key]
else:
    dict[key] = []
    return dict[key]

単一のreturn dict.setdefault(key, [])ステートメントに減らすことができます。

インタプリタは、Cスタックを埋めてコアダンプまたはGPFを発生させる前に、暴走再帰をキャッチするために最大再帰深度を設定します。 以前は、Pythonをコンパイルしたときにこの制限が修正されていましたが、2.0では、 sys.getrecursionlimit()および sys.setrecursionlimit()を使用して最大再帰深度を読み取って変更できます。 デフォルト値は1000であり、特定のプラットフォームのおおよその最大値は、新しいスクリプトMisc/find_recursionlimit.pyを実行することで見つけることができます。


2.0への移植

新しいPythonリリースは、以前のリリースとの互換性を保つように努力しており、記録はかなり良好です。 ただし、一部の変更は十分に役立つと見なされます。通常、変更によって、積極的に誤っていることが判明した最初の設計上の決定が修正されるため、下位互換性の破綻を常に回避できるとは限りません。 このセクションでは、古いPythonコードが破損する可能性のあるPython2.0の変更点を示します。

おそらくほとんどのコードを壊す変更は、いくつかのメソッドで受け入れられる引数を厳しくすることです。 一部のメソッドは複数の引数を取り、それらをタプルとして扱います。特に、append()insert()などのさまざまなリストメソッドです。 以前のバージョンのPythonでは、Lがリストの場合、L.append( 1,2 )はタプル(1,2)をリストに追加します。 Python 2.0では、これにより TypeError 例外が発生し、次のメッセージが表示されます。'appendには引数が1つだけ必要です。 2与えられた '。 修正は、括弧のセットを追加して、両方の値をタプルとして渡すことです:L.append( (1,2) )

これらのメソッドの以前のバージョンは、PythonのCインターフェースで古い関数を使用して引数を解析したため、より寛容でした。 2.0は、現在の引数解析関数であるPyArg_ParseTuple()を使用するようにそれらを最新化します。これは、より役立つエラーメッセージを提供し、複数の引数の呼び出しをエラーとして扱います。 どうしても2.0を使用する必要があるがコードを修正できない場合は、Objects/listobject.cを編集し、プリプロセッサシンボルNO_STRICT_LIST_APPENDを定義して、古い動作を維持できます。 これはお勧めしません。

socket モジュールの一部の機能はまだこのように寛容です。 たとえば、socket.connect( ('hostname', 25) )()は正しい形式であり、IPアドレスを表すタプルを渡しますが、socket.connect( 'hostname', 25 )()も機能します。 socket.connect_ex()socket.bind()も同様に簡単です。 2.0alpha1はこれらの関数を強化しましたが、ドキュメントは実際には誤った複数の引数形式を使用していたため、多くの人がより厳密なチェックで壊れてしまうコードを作成しました。 GvRは一般の反応に直面して変更を取り消したため、 socket モジュールのドキュメントが修正され、複数の引数の形式が非推奨としてマークされました。 将来のPythonバージョンで再び強化される予定です。

文字列リテラルの\xエスケープは、正確に2桁の16進数を使用するようになりました。 以前は、「x」に続くすべての16進数を消費し、結果の下位8ビットを取得するため、\x123456\x56と同等でした。

AttributeError および NameError 例外には、よりわかりやすいエラーメッセージがあり、そのテキストは'Spam' instance has no attribute 'eggs'またはname 'eggs' is not definedのようになります。 以前は、エラーメッセージは属性名eggsが欠落しているだけでしたが、この事実を利用するために記述されたコードは2.0で機能しなくなります。

整数と長整数をもう少し互換性のあるものにするために、いくつかの作業が行われました。 1.5.2では、Solarisにラージファイルサポートが追加され、2GiBを超えるファイルを読み取ることができるようになりました。 これにより、ファイルオブジェクトのtell()メソッドが通常の整数ではなく長整数を返すようになりました。 一部のコードは、2つのファイルオフセットを減算し、その結果を使用してシーケンスを乗算したり、文字列をスライスしたりしようとしますが、これにより TypeError が発生しました。 2.0では、長整数を使用してシーケンスを乗算またはスライスすることができ、直感的に期待どおりに動作します。 3L * 'abc'は 'abcabcabc'を生成し、(0,1,2,3)[2L:4L]は(2,3)を生成します。 長整数は、ファイルオブジェクトのseek()メソッドや、%演算子( []でサポートされる形式など、以前は整数のみが受け入れられていたさまざまなコンテキストでも使用できます。 X206X]、%i%xなど)。 たとえば、"%d" % 2L**64は文字列18446744073709551616を生成します。

すべての中で最も微妙な長整数の変更は、長整数の str()に末尾の「L」文字がないことですが、 repr()にはまだ含まれています。 「L」は、文字を切り落とすために邪魔にならないようにする必要があるため、通常の整数と同じように見える長整数を印刷したい多くの人々を悩ませました。 これは2.0では問題ではなくなりましたが、str(longval)[:-1]を実行し、「L」が存在すると想定するコードでは、最後の桁が失われます。

floatの repr()を取得すると、 str()とは異なるフォーマット精度が使用されるようになりました。 repr()はCのsprintf()%.17gフォーマット文字列を使用しますが、 str()は以前と同様に%.12gを使用します。 その結果、 repr()は、特定の数値について、 str()よりも小数点以下の桁数が多くなる場合があります。 たとえば、数値8.1は2進数で正確に表すことができないため、repr(8.1)'8.0999999999999996'であり、str(8.1)は'8.1'です。

-Xコマンドラインオプションは、すべての標準例外をクラスではなく文字列に変換していましたが、削除されました。 標準の例外は常にクラスになります。 標準の例外を含むexceptionsモジュールは、PythonからBarryWarsawとFredrikLundhによって作成された組み込みのCモジュールに変換されました。


変更の拡張/埋め込み

一部の変更は隠蔽されており、C拡張モジュールを作成したり、より大きなアプリケーションにPythonインタープリターを埋め込んだりする人にのみ明らかになります。 PythonのCAPIを扱っていない場合は、このセクションをスキップしても問題ありません。

Python C APIのバージョン番号がインクリメントされたため、2.0で動作するには、1.5.2用にコンパイルされたC拡張機能を再コンパイルする必要があります。 Windowsでは、Windows DLLの動作が原因で、Python2.0がPython1.5.x用に構築されたサードパーティの拡張機能をインポートできないため、Pythonで例外が発生し、インポートが失敗します。

Jim FultonのExtensionClassモジュールのユーザーは、ExtensionClassesが isinstance()および issubclass()でサポートされるようにフックが追加されたことを喜んで知っています。 これは、if type(obj) == myExtensionClassなどのコードを書くことを覚えておく必要がなくなったことを意味しますが、より自然なif isinstance(obj, myExtensionClass)を使用できます。

Python/importdl.cファイルは、多くの異なるプラットフォームでの動的ロードをサポートするための#ifdefの塊でしたが、GregSteinによってクリーンアップおよび再編成されました。 importdl.cは非常に小さくなり、プラットフォーム固有のコードはPython/dynload_*.cファイルの束に移動されました。 別のクリーンアップ:インクルード/ディレクトリには、さまざまな移植性ハックを保持するmy*.hファイルも多数ありました。 それらは単一のファイルInclude/pyport.hにマージされました。

ウラジミール・マランゴゾフの待望のmalloc再構築が完了し、PythonインタープリターがCの標準malloc()の代わりにカスタムアロケーターを簡単に使用できるようになりました。 ドキュメントについては、Include/pymem.hおよびInclude/objimpl.hのコメントをお読みください。 インターフェイスが打ち出された間の長い議論については、python.orgの「patches」および「python-dev」リストのWebアーカイブを参照してください。

MacOS用のGUSI開発環境の最近のバージョンは、POSIXスレッドをサポートしています。 したがって、PythonのPOSIXスレッドサポートがMacintoshで機能するようになりました。 ユーザースペースGNU pthライブラリを使用したスレッドサポートも提供されました。

Windowsでのスレッドサポートも強化されました。 Windowsは、競合の場合にのみカーネルオブジェクトを使用するスレッドロックをサポートしています。 競合がない一般的なケースでは、1桁高速な単純な関数を使用します。 NT上のPython1.5.2のスレッドバージョンは、スレッド化されていないバージョンの2倍の速度です。 2.0の変更では、違いはわずか10%です。 これらの改善は、YakovMarkovitchによって提供されました。

Python2.0のソースはANSICプロトタイプのみを使用するようになったため、PythonのコンパイルにはANSI Cコンパイラが必要になり、K&RCのみをサポートするコンパイラを使用して実行できなくなりました。

以前は、Python仮想マシンはバイトコードに16ビットの数値を使用していたため、ソースファイルのサイズが制限されていました。 特に、これはPythonソースのリテラルリストと辞書の最大サイズに影響しました。 Pythonコードを生成している人は、この制限にぶつかることがあります。 チャールズGによるパッチ。 Waldmanは制限を2^16から2^{32}に引き上げます。

モジュールの初期化時にモジュールの辞書に定数を追加することを目的とした3つの新しい便利な関数、PyModule_AddObject()PyModule_AddIntConstant()、およびPyModule_AddStringConstant()が追加されました。 これらの各関数は、モジュールオブジェクト、追加される名前を含むnullで終了するC文字列、および名前に割り当てられる値の3番目の引数を取ります。 この3番目の引数は、それぞれPythonオブジェクト、C long、またはC文字列です。

Unixスタイルのシグナルハンドラー用にラッパーAPIが追加されました。 PyOS_getsig()はシグナルハンドラーを取得し、PyOS_setsig()は新しいハンドラーを設定します。


Distutils:モジュールを簡単にインストールできるようにする

Python 2.0以前は、モジュールのインストールは面倒な作業でした。Pythonがインストールされている場所や、拡張モジュールに使用するコンパイラオプションを自動的に把握する方法はありませんでした。 ソフトウェアの作者は、Makefileと構成ファイルを編集するという骨の折れる儀式を経験しなければなりませんでした。これは実際にはUnixでのみ機能し、WindowsとMacOSはサポートされていません。 Pythonユーザーは、拡張パッケージごとに異なる非常に異なるインストール手順に直面したため、Pythonインストールの管理は面倒な作業になりました。

Greg Wardが管理する配布ユーティリティのSIGは、パッケージのインストールをはるかに簡単にするシステムであるDistutilsを作成しました。 これらは、Pythonの標準ライブラリの新しい部分である distutils パッケージを形成します。 最良の場合、ソースからPythonモジュールをインストールするには、同じ手順が必要です。まず、tarballまたはzipアーカイブを解凍し、「python setup.py install」を実行します。 プラットフォームが自動的に検出され、コンパイラが認識され、C拡張モジュールがコンパイルされ、ディストリビューションが適切なディレクトリにインストールされます。 オプションのコマンドライン引数を使用すると、インストールプロセスをより細かく制御できます。また、distutilsパッケージには、デフォルトを上書きする場所が多数用意されています。ビルドをインストールから分離したり、デフォルト以外のディレクトリにビルドまたはインストールしたりできます。

Distutilsを使用するには、setup.pyスクリプトを作成する必要があります。 単純なケースでは、ソフトウェアに.pyファイルのみが含まれている場合、最小のsetup.pyは数行の長さになります。

from distutils.core import setup
setup (name = "foo", version = "1.0",
       py_modules = ["module1", "module2"])

ソフトウェアがいくつかのパッケージで構成されている場合、setup.pyファイルはそれほど複雑ではありません。

from distutils.core import setup
setup (name = "foo", version = "1.0",
       packages = ["package", "package.subpackage"])

AC拡張は最も複雑なケースになる可能性があります。 PyXMLパッケージから抜粋した例を次に示します。

from distutils.core import setup, Extension

expat_extension = Extension('xml.parsers.pyexpat',
     define_macros = [('XML_NS', None)],
     include_dirs = [ 'extensions/expat/xmltok',
                      'extensions/expat/xmlparse' ],
     sources = [ 'extensions/pyexpat.c',
                 'extensions/expat/xmltok/xmltok.c',
                 'extensions/expat/xmltok/xmlrole.c', ]
       )
setup (name = "PyXML", version = "0.5.4",
       ext_modules =[ expat_extension ] )

Distutilsは、ソースおよびバイナリディストリビューションの作成も処理できます。 「python setup.py sdist」によって実行される「sdist」コマンドは、foo-1.0.tar.gzなどのソースディストリビューションを構築します。 新しいコマンドの追加は難しくありません。「bdist_rpm」コマンドと「bdist_wininst」コマンドは、ソフトウェアのRPMディストリビューションとWindowsインストーラーをそれぞれ作成するためにすでに提供されています。 DebianパッケージやSolaris .pkgファイルなどの他の配布形式を作成するコマンドは、開発のさまざまな段階にあります。

これはすべて、Pythonドキュメントの基本セットに参加する新しいマニュアル Pythonモジュールの配布に記載されています。


XMLモジュール

Python 1.5.2には、SjoerdMullenderによって提供されたxmllibモジュールの形式の単純なXMLパーサーが含まれていました。 1.5.2のリリース以降、XMLを処理するための2つの異なるインターフェイスが一般的になりました。SAX2(Simple API for XMLのバージョン2)は、xmllibといくつかの類似点を持つイベント駆動型インターフェイスとDOM(ドキュメントオブジェクト)を提供します。モデル)は、ツリーベースのインターフェイスを提供し、XMLドキュメントをトラバースおよび変更可能なノードのツリーに変換します。 Python 2.0には、 xml パッケージの一部として、SAX2インターフェイスと簡素化されたDOMインターフェイスが含まれています。 ここでは、これらの新しいインターフェイスの概要を説明します。 詳細については、Pythonのドキュメントまたはソースコードを参照してください。 Python XML SIGは、ドキュメントの改善にも取り組んでいます。

SAX2サポート

SAXは、XMLを解析するためのイベント駆動型インターフェースを定義します。 SAXを使用するには、SAXハンドラークラスを作成する必要があります。 ハンドラークラスは、SAXによって提供されるさまざまなクラスを継承し、XMLパーサーによって呼び出されるさまざまなメソッドをオーバーライドします。 たとえば、startElement()およびendElement()メソッドは、パーサーが検出するすべての開始タグと終了タグに対して呼び出され、characters()メソッドは、文字データのすべてのチャンクに対して呼び出されます。前方へ。

イベントドリブンアプローチの利点は、ドキュメント全体を一度にメモリに常駐させる必要がないことです。これは、非常に大きなドキュメントを処理している場合に重要です。 ただし、ドキュメント構造を複雑な方法で変更しようとすると、SAXハンドラークラスの記述が非常に複雑になる可能性があります。

たとえば、この小さなサンプルプログラムは、開始タグと終了タグごとにメッセージを出力し、それを使用してファイルhamlet.xmlを解析するハンドラーを定義します。

from xml import sax

class SimpleHandler(sax.ContentHandler):
    def startElement(self, name, attrs):
        print 'Start of element:', name, attrs.keys()

    def endElement(self, name):
        print 'End of element:', name

# Create a parser object
parser = sax.make_parser()

# Tell it what handler to use
handler = SimpleHandler()
parser.setContentHandler( handler )

# Parse a file!
parser.parse( 'hamlet.xml' )

詳細については、Pythonのドキュメント、または http://pyxml.sourceforge.net/topics/howto/xml-howto.htmlのXMLHOWTOを参照してください。


DOMサポート

ドキュメントオブジェクトモデルは、XMLドキュメントのツリーベースの表現です。 トップレベルのDocumentインスタンスはツリーのルートであり、トップレベルのElementインスタンスである単一の子があります。 このElementには、文字データを表す子ノードと、独自の子を持つ可能性のあるサブ要素などがあります。 DOMを使用すると、結果のツリーを好きなようにトラバースしたり、要素と属性の値にアクセスしたり、ノードを挿入および削除したり、ツリーをXMLに変換したりできます。

DOMは、DOMツリーを作成し、新しいノードを追加したりサブツリーを再配置したりして変更し、出力として新しいXMLドキュメントを生成できるため、XMLドキュメントの変更に役立ちます。 DOMツリーを手動で作成してXMLに変換することもできます。これは、単に<tag1></tag1>をファイルに書き込むよりも柔軟な方法でXML出力を生成できます。

Pythonに含まれているDOM実装は、 xml.dom.minidom モジュールにあります。 これは、XML名前空間をサポートするレベル1DOMの軽量実装です。 parse()およびparseString()の便利な関数は、DOMツリーを生成するために提供されています。

from xml.dom import minidom
doc = minidom.parse('hamlet.xml')

docDocumentインスタンスです。 Documentは、ElementTextなどの他のすべてのDOMクラスと同様に、Node基本クラスのサブクラスです。 したがって、DOMツリー内のすべてのノードは、ノードとその子のXML表現を含む文字列を返すtoxml()などの特定の一般的なメソッドをサポートします。 各クラスには、独自の特別なメソッドもあります。 たとえば、ElementおよびDocumentインスタンスには、指定されたタグ名を持つすべての子要素を検索するメソッドがあります。 前の2行の例からの続き:

perslist = doc.getElementsByTagName( 'PERSONA' )
print perslist[0].toxml()
print perslist[1].toxml()

Hamlet XMLファイルの場合、上記の数行が出力されます。

<PERSONA>CLAUDIUS, king of Denmark. </PERSONA>
<PERSONA>HAMLET, son to the late, and nephew to the present king.</PERSONA>

ドキュメントのルート要素はdoc.documentElementとして利用可能であり、その子はノードを削除、追加、または削除することで簡単に変更できます。

root = doc.documentElement

# Remove the first child
root.removeChild( root.childNodes[0] )

# Move the new first child to the end
root.appendChild( root.childNodes[0] )

# Insert the new first child (originally,
# the third child) before the 20th child.
root.insertBefore( root.childNodes[0], root.childNodes[20] )

繰り返しになりますが、さまざまなNodeクラスとそれらのさまざまなメソッドの完全なリストについては、Pythonのドキュメントを参照してください。


PyXMLとの関係

XML Special Interest Groupは、しばらくの間XML関連のPythonコードに取り組んできました。 PyXMLと呼ばれるそのコード配布は、SIGのWebページ https://www.python.org/community/sigs/current/xml-sigから入手できます。 PyXMLディストリビューションでは、パッケージ名xmlも使用されていました。 PyXMLを使用するプログラムを作成したことがある場合は、2.0 xml パッケージとの互換性について疑問に思われるかもしれません。

答えは、Python2.0の xml パッケージはPyXMLと互換性がありませんが、最新バージョンのPyXMLをインストールすることで互換性を持たせることができるということです。 多くのアプリケーションは、Python 2.0に含まれているXMLサポートを利用できますが、より複雑なアプリケーションでは、完全なPyXMLパッケージをインストールする必要があります。 インストールすると、PyXMLバージョン0.6.0以降がPythonに同梱されている xml パッケージに置き換わり、標準パッケージの厳密なスーパーセットになり、多数の追加機能が追加されます。 PyXMLの追加機能には次のものがあります。

  • 4DOM、FourThought、Incの完全なDOM実装。
  • Lars MariusGarsholによって作成されたxmlproc検証パーサー。
  • FredrikLundhによって作成されたsgmlopパーサーアクセラレータモジュール。


モジュールの変更

Pythonの広範な標準ライブラリに多くの改善とバグ修正が行われました。 影響を受けるモジュールには、 readlineConfigParsercgicalendarposix 、 readline [ X212X]、xmllibaifcchunk, waveランダムシェルフ、および nntplib 。 パッチごとの正確な詳細については、CVSログを参照してください。

Brian Gallewは、 socket モジュールのOpenSSLサポートに貢献しました。 OpenSSLは、ソケットを介して送信されるデータを暗号化するSecure SocketLayerの実装です。 Pythonをコンパイルするときに、Modules/Setupを編集してSSLサポートを含めることができます。これにより、 socket モジュールに追加の関数socket.ssl(socket, keyfile, certfile)が追加され、ソケットオブジェクトを取得してSSLを返します。ソケット。 httplibおよび urllib モジュールもhttps:// URLをサポートするように変更されましたが、FTPまたはSMTP overSSLを実装した人は誰もいません。

httplibモジュールは、HTTP /1.1をサポートするようにGregSteinによって書き直されました。 httplibの1.5バージョンとの下位互換性が提供されますが、パイプラインなどのHTTP / 1.1機能を使用するには、異なるインターフェイスのセットを使用するようにコードを書き直す必要があります。

TkinterモジュールはTcl / Tkバージョン8.1、8.2、または8.3をサポートするようになり、古い7.xバージョンのサポートは終了しました。 Tkinterモジュールは、TkウィジェットでのUnicode文字列の表示をサポートするようになりました。 また、Fredrik Lundhは、create_linecreate_polygonなどの操作を、特に多くの座標を使用する場合にはるかに高速にする最適化に貢献しました。

curses モジュールは、Oliver Andrichの拡張バージョンから大幅に拡張され、色、代替文字セットのサポート、パッド、マウスのサポートなど、ncursesおよびSYSVcursesからの多くの追加機能を提供します。 これは、モジュールがBSDの呪いしかないオペレーティングシステムと互換性がなくなったことを意味しますが、このカテゴリに分類される現在保守されているOSはないようです。

2.0のUnicodeサポートに関する前述の説明で述べたように、 re モジュールによって提供される正規表現の基本的な実装が変更されました。 SREは、Fredrik Lundhによって作成され、部分的にHewlett Packardによって資金提供された新しい正規表現エンジンであり、8ビット文字列とUnicode文字列の両方に対するマッチングをサポートしています。


新しいモジュール

いくつかの新しいモジュールが追加されました。 簡単な説明とともにそれらを簡単にリストします。 特定のモジュールの詳細については、2.0のドキュメントを参照してください。

  • atexit :Pythonインタープリターが終了する前に呼び出される関数を登録します。 現在sys.exitfuncを直接設定しているコードは、代わりに atexit モジュールを使用するように変更する必要があります。代わりに、 atexit をインポートし、 atexit.register()を呼び出します。終了時に呼び出される関数。 (Skip Montanaroによる寄稿。)
  • コーデックencodingsunicodedata :新しいUnicodeサポートの一部として追加されました。
  • filecmp :廃止された古いcmpcmpcachedircmpモジュールに取って代わります。 (GordonMacMillanとMosheZadkaによる寄稿。)
  • gettext :このモジュールは、GNU gettextメッセージカタログライブラリへのインターフェイスを提供することにより、Pythonプログラムの国際化(I18N)およびローカリゼーション(L10N)のサポートを提供します。 (MartinvonLöwis、Peter Funk、James Henstridgeによる個別の寄稿から、Barry Warsawによって統合されました。)
  • linuxaudiodev:Linuxでの/dev/audioデバイスのサポート、既存のsunaudiodevモジュールのツイン。 (Peter Boschによる寄稿、Jeremy Hyltonによる修正あり。)
  • mmap :WindowsとUnixの両方でメモリマップトファイルへのインターフェイス。 ファイルの内容はメモリに直接マッピングでき、その時点でファイルは可変文字列のように動作するため、ファイルの内容を読み取って変更できます。 re モジュールなど、通常の文字列を期待する関数に渡すこともできます。 (Sam Rushingによる寄稿、AMによるいくつかの拡張 Kuchling。)
  • pyexpat:ExpatXMLパーサーへのインターフェース。 (Paul Prescodによる寄稿)
  • robotparserrobots.txtファイルを解析します。このファイルは、Webサイトの特定の領域を丁寧に回避するWebスパイダーを作成するために使用されます。 パーサーは、robots.txtファイルの内容を受け入れ、そこから一連のルールを作成し、特定のURLのフェッチ可能性に関する質問に答えることができます。 (Skip Montanaroによる寄稿。)
  • tabnanny :Pythonソースコードのあいまいなインデントをチェックするためのモジュール/スクリプト。 (Tim Petersによる寄稿。)
  • UserString:文字列のように動作するオブジェクトを導出するのに役立つ基本クラス。
  • webbrowser :特定のURLでWebブラウザーを起動するためのプラットフォームに依存しない方法を提供するモジュール。 プラットフォームごとに、さまざまなブラウザが特定の順序で試されます。 ユーザーは、 BROWSER 環境変数を設定することにより、起動するブラウザーを変更できます。 (元々はEricSに触発されました。 同様の機能を追加した urllib に対するRaymondのパッチですが、最終的なモジュールは、FredDrakeによってTools/idle/BrowserControl.pyとして最初に実装され、Fredによって標準ライブラリに適合されたコードからのものです。)
  • _winreg:Windowsレジストリへのインターフェイス。 _winregは、1995年からPythonWinの一部であったが、現在はコアディストリビューションに追加され、Unicodeをサポートするように拡張された関数を適応させたものです。 _winregは、BillTuttとMarkHammondによって作成されました。
  • zipfile :ZIP形式のアーカイブを読み書きするためのモジュール。 これらは、DOS / Windowsの PKZIP またはUnixの zip によって作成されたアーカイブであり、 gzip 形式のファイル([X165Xでサポートされている)と混同しないでください。 ] gzip モジュール)(JamesCによる寄稿。 アールストローム。)
  • imputil:既存のihooksモジュールと比較して、カスタマイズされたインポートフックを作成するためのより簡単な方法を提供するモジュール。 (Greg Steinによって実装され、途中でpython-devについて多くの議論があります。)


IDLEの改善

IDLEは、Tkinterを使用して記述された公式のPythonクロスプラットフォームIDEです。 Python2.0にはIDLE0.6が含まれており、多くの新機能と改善が追加されています。 部分的なリスト:

  • 特に構文の強調表示と自動インデントの分野でのUIの改善と最適化。
  • クラスブラウザに、モジュールの最上位関数など、より多くの情報が表示されるようになりました。
  • タブ幅は、ユーザーが設定できるオプションになりました。 既存のPythonファイルを開くと、IDLEはインデント規則を自動的に検出し、適応します。
  • ブラウザでPythonドキュメントを開くために使用される、さまざまなプラットフォームでのブラウザの呼び出しがサポートされるようになりました。
  • IDLEにコマンドラインが追加されました。これは、バニラPythonインタープリターとほぼ同じです。
  • 通話のヒントが多くの場所に追加されました。
  • IDLEをパッケージとしてインストールできるようになりました。
  • エディタウィンドウの下部に行/列バーが表示されます。
  • 3つの新しいキーストロークコマンド:チェックモジュール( Alt-F5 )、インポートモジュール( F5 )、およびスクリプトの実行( Ctrl-F5 )。


削除および非推奨のモジュール

いくつかのモジュールは、廃止されたため、または同じことを行うためのより良い方法があるために削除されました。 stdwinモジュールはなくなりました。 これは、プラットフォームに依存しないウィンドウツールキット用であり、現在は開発されていません。

多くのモジュールがlib-oldサブディレクトリに移動されました:cmpcmpcachedircmpdump、 [X116X ]、greppackmailpolyutilwhatsoundzmodlib-oldに移動されたモジュールに依存するコードがある場合は、そのディレクトリをsys.pathに追加するだけで元に戻すことができますが、これらを使用するコードを更新することをお勧めします。モジュール。


謝辞

著者は、この記事のさまざまなドラフトについて提案を提供してくれた次の人々に感謝します:David Bolen、Mark Hammond、Gregg Hauser、Jeremy Hylton、Fredrik Lundh、Detlef Lannert、Aahz Maruch、Skip Montanaro、Vladimir Marangozov、Tobias Polzin、Guidoヴァンロッサム、ニールスキームナウアー、ラスシュミット。