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

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

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のインスタンスを辞書キーとして使用できます。 セットは辞書の上に構築されるため、セット内の要素はハッシュ可能である必要があります。

簡単な例を次に示します。

>>> import sets
>>> S = sets.Set([1,2,3])
>>> S
Set([1, 2, 3])
>>> 1 in S
True
>>> 0 in S
False
>>> S.add(5)
>>> S.remove(3)
>>> S
Set([1, 2, 5])
>>>

セットの和集合と共通部分は、union()およびintersection()メソッドを使用して計算できます。 別の表記法では、ビット演算子&および|を使用します。 可変セットには、これらのメソッドのインプレースバージョンunion_update()およびintersection_update()もあります。

>>> S1 = sets.Set([1,2,3])
>>> S2 = sets.Set([4,5,6])
>>> S1.union(S2)
Set([1, 2, 3, 4, 5, 6])
>>> S1 | S2                  # Alternative notation
Set([1, 2, 3, 4, 5, 6])
>>> S1.intersection(S2)
Set([])
>>> S1 & S2                  # Alternative notation
Set([])
>>> S1.union_update(S2)
>>> S1
Set([1, 2, 3, 4, 5, 6])
>>>

2つのセットの対称差を取ることも可能です。 これは、共通部分にないユニオン内のすべての要素のセットです。 別の言い方をすれば、対称差には、正確に1つのセットに含まれるすべての要素が含まれます。 繰り返しになりますが、別の表記法(^)と、不格好な名前symmetric_difference_update()のインプレースバージョンがあります。

>>> S1 = sets.Set([1,2,3,4])
>>> S2 = sets.Set([3,4,5,6])
>>> S1.symmetric_difference(S2)
Set([1, 2, 5, 6])
>>> S1 ^ S2
Set([1, 2, 5, 6])
>>>

あるセットが別のセットのサブセットであるかスーパーセットであるかをチェックするためのissubset()およびissuperset()メソッドもあります。

>>> S1 = sets.Set([1,2,3])
>>> S2 = sets.Set([2,3])
>>> S2.issubset(S1)
True
>>> S1.issubset(S2)
False
>>> S1.issuperset(S2)
True
>>>

も参照してください

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 ステートメントに達すると、ローカル変数が破棄され、結果の値が呼び出し元に返されます。 後で同じ関数を呼び出すと、新しいローカル変数のセットが取得されます。 しかし、関数の終了時にローカル変数が破棄されなかった場合はどうなるでしょうか。 後で中断したところから機能を再開できるとしたらどうでしょうか。 これはジェネレーターが提供するものです。 それらは再開可能な機能と考えることができます。

ジェネレーター関数の最も簡単な例を次に示します。

def generate_ints(N):
    for i in range(N):
        yield i

新しいキーワード yield がジェネレーターに導入されました。 yieldステートメントを含む関数はすべてジェネレーター関数です。 これは、結果として関数を特別にコンパイルするPythonのバイトコードコンパイラによって検出されます。

ジェネレーター関数を呼び出すと、単一の値は返されません。 代わりに、イテレータプロトコルをサポートするジェネレータオブジェクトを返します。 yield ステートメントを実行すると、ジェネレーターは return ステートメントと同様に、iの値を出力します。 yieldステートメントとreturnステートメントの大きな違いは、yieldに達すると、ジェネレーターの実行状態が一時停止され、ローカル変数が保持されることです。 ジェネレータの.next()メソッドの次の呼び出しで、関数はyieldステートメントの直後に実行を再開します。 (複雑な理由により、yieldステートメントはtryfinallyステートメントの try ブロック内では許可されていません。 を読んでください。 yieldと例外の間の相互作用の完全な説明については、] PEP 255 を参照してください。)

generate_ints()ジェネレーターの使用例は次のとおりです。

>>> gen = generate_ints(3)
>>> gen
<generator object at 0x8117f90>
>>> gen.next()
0
>>> gen.next()
1
>>> gen.next()
2
>>> gen.next()
Traceback (most recent call last):
  File "stdin", line 1, in ?
  File "stdin", line 2, in generate_ints
StopIteration

同様に、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には、さらに興味深い例がいくつか含まれています。 最も単純なものは、ジェネレーターを再帰的に使用して、ツリーの順序どおりの走査を実装します。

# A recursive generator that generates Tree leaves in in-order.
def inorder(t):
    if t:
        for x in inorder(t.left):
            yield x
        yield t.label
        for x in inorder(t.right):
            yield x

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つの例は、これがどのように見えるかを示しています。

sentence := "Store it in the neighboring harbor"
if (i := find("or", sentence)) > 5 then write(i)

アイコンでは、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ファイルは次のように宣言できます。

#!/usr/bin/env python
# -*- coding: 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 278 -ユニバーサル改行サポート
Jack Jansenによって書かれ、実装されました。


PEP 279:enumerate()

新しい組み込み関数 enumerate()は、特定のループを少し明確にします。 enumerate(thing)things はイテレーターまたはシーケンスのいずれか)は、(0, thing[0])(1, thing[1])(2, thing[2])、を返すイテレーターを返します。などなど。

リストのすべての要素を変更する一般的なイディオムは次のようになります。

for i in range(len(L)):
    item = L[i]
    # ... compute some result based on item ...
    L[i] = result

これは、 enumerate()を使用して次のように書き換えることができます。

for i, item in enumerate(L):
    # ... compute some result based on item ...
    L[i] = result

も参照してください

PEP 279 -enumerate()組み込み関数
レイモンドDによって書かれ、実装されています。 ヘッティンガー。


PEP 282:ロギングパッケージ

ログを書き込むための標準パッケージ logging がPython2.3に追加されました。 ロギング出力を生成するための強力で柔軟なメカニズムを提供します。ロギング出力は、さまざまな方法でフィルタリングおよび処理できます。 標準形式で記述された構成ファイルを使用して、プログラムのロギング動作を制御できます。 Pythonには、ログレコードを標準エラーまたはファイルやソケットに書き込んだり、システムログに送信したり、特定のアドレスに電子メールで送信したりするハンドラーが含まれています。 もちろん、独自のハンドラークラスを作成することもできます。

Loggerクラスはプライマリクラスです。 ほとんどのアプリケーションコードは、1つ以上のLoggerオブジェクトを処理し、各オブジェクトはアプリケーションの特定のサブシステムによって使用されます。 各Loggerは名前で識別され、名前は.をコンポーネント区切り文字として使用して階層に編成されます。 たとえば、serverserver.auth、およびserver.networkという名前のLoggerインスタンスがあるとします。 後者の2つのインスタンスは、階層内でserverの下にあります。 つまり、serverの冗長性を上げるか、serverメッセージを別のハンドラーに送信すると、変更はserver.authおよび [に記録されたレコードにも適用されます。 X184X]。 他のすべてのロガーの親であるルートLoggerもあります。

簡単に使用できるように、 logging パッケージには、常にルートログを使用する便利な関数がいくつか含まれています。

import logging

logging.debug('Debugging information')
logging.info('Informational message')
logging.warning('Warning:config file %s not found', 'server.conf')
logging.error('Error occurred')
logging.critical('Critical error -- shutting down')

これにより、次の出力が生成されます。

WARNING:root:Warning:config file server.conf not found
ERROR:root:Error occurred
CRITICAL:root:Critical error -- shutting down

デフォルト設定では、情報メッセージとデバッグメッセージは抑制され、出力は標準エラーに送信されます。 ルートロガーでsetLevel()メソッドを呼び出すことにより、情報メッセージとデバッグメッセージの表示を有効にできます。

warning()呼び出しで文字列フォーマット演算子が使用されていることに注意してください。 メッセージをログに記録するためのすべての関数は、引数(msg, arg1, arg2, ...)を取り、msg % (arg1, arg2, ...)の結果の文字列をログに記録します。

最新のトレースバックを記録するexception()関数もあります。 キーワード引数 exc_info に真の値を指定すると、他の関数もトレースバックを記録します。

def f():
    try:    1/0
    except: logging.exception('Problem recorded')

f()

これにより、次の出力が生成されます。

ERROR:root:Problem recorded
Traceback (most recent call last):
  File "t.py", line 6, in f
    1/0
ZeroDivisionError: integer division or modulo by zero

少し高度なプログラムでは、ルートロガー以外のロガーを使用します。 getLogger(name)関数は、特定のログを取得するために使用され、ログがまだ存在しない場合は作成します。 getLogger(None)はルートロガーを返します。

log = logging.getLogger('server')
 ...
log.info('Listening on port %i', port)
 ...
log.critical('Disk full')
 ...

ログレコードは通常、階層の上位に伝播されるため、server.authに記録されたメッセージはserverおよびrootにも表示されますが、Loggerはこれを防ぐことができます。 propagate属性を False に設定します。

logging パッケージによって提供される、カスタマイズ可能なクラスは他にもあります。 Loggerインスタンスがメッセージをログに記録するように指示されると、LogRecordインスタンスが作成され、任意の数の異なるHandlerインスタンスに送信されます。 ロガーとハンドラーにはフィルターのリストを添付することもでき、各フィルターによってLogRecordが無視されたり、レコードを渡す前に変更したりすることができます。 最終的に出力されると、LogRecordインスタンスはFormatterクラスによってテキストに変換されます。 これらのクラスはすべて、特別に作成された独自のクラスに置き換えることができます。

これらすべての機能を備えた logging パッケージは、最も複雑なアプリケーションにも十分な柔軟性を提供するはずです。 これはその機能の不完全な概要にすぎないため、すべての詳細についてはパッケージのリファレンスドキュメントを参照してください。 PEP 282 を読むことも役に立ちます。

も参照してください

PEP 282 -ロギングシステム
VinaySajipとTrentMickによって書かれました。 VinaySajipによって実装されました。


PEP 285:ブール型

Python2.3にブール型が追加されました。 __builtin__モジュールに TrueFalse の2つの新しい定数が追加されました。 ( True および False 定数がPython2.2.1の組み込みに追加されましたが、2.2.1バージョンは単に1と0の整数値に設定されており、そうではありません。別のタイプ。)

この新しい型の型オブジェクトの名前は bool です。 そのコンストラクターは任意のPython値を受け取り、それを True または False に変換します。

>>> bool(1)
True
>>> bool(0)
False
>>> bool([])
False
>>> bool( (1,) )
True

ほとんどの標準ライブラリモジュールと組み込み関数は、ブール値を返すように変更されています。

>>> obj = []
>>> hasattr(obj, 'append')
True
>>> isinstance(obj, list)
True
>>> isinstance(obj, tuple)
False

Pythonのブール値は、コードをより明確にすることを主な目的として追加されました。 たとえば、関数を読んでいて、ステートメントreturn 1に遭遇した場合、1がブール真理値、インデックス、または他の量を乗算する係数を表すかどうか疑問に思うかもしれません。 ただし、ステートメントがreturn Trueの場合、戻り値の意味は非常に明確です。

Pythonのブール値は、厳密な型チェックのために追加されませんでした。 Pascalなどの非常に厳密な言語では、ブール値を使用した算術演算も実行できず、 if ステートメントの式が常にブール値の結果に評価される必要があります。 PEP 285 が明示的に述べているように、Pythonはこれほど厳密ではなく、決してそうなることはありません。 つまり、ifステートメントでは、リスト、タプル、またはランダムなオブジェクトに評価される式であっても、任意の式を使用できます。 ブール型は int クラスのサブクラスであるため、ブールを使用した算術演算は引き続き機能します。

>>> True + 1
2
>>> False + 1
1
>>> False * 75
0
>>> True * 75
75

TrueFalse を文で要約すると、これらは整数値1と0を綴る別の方法ですが、 str()という1つの違いがあります。 repr()は、'1'および'0'の代わりに、文字列'True'および'False'を返します。

も参照してください

PEP 285 -ブール型の追加
GvRによって作成および実装されています。


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 293 -コーデックエラー処理コールバック
WalterDörwaldによって書かれ、実装されました。


PEP 301:Distutilsのパッケージインデックスとメタデータ

長い間要求されていたPythonカタログのサポートは、2.3で初めて登場します。

カタログの中心は、新しいDistutils register コマンドです。 ランニングpython setup.py register名前、バージョン、メンテナ、説明など、パッケージを説明するメタデータを収集し、中央のカタログサーバーに送信します。 結果のカタログは、 https://pypi.org から入手できます。

カタログをもう少し便利にするために、新しいオプションの classifiers キーワード引数がDistutils setup()関数に追加されました。 Trove スタイルの文字列のリストを提供して、ソフトウェアの分類に役立てることができます。

これは、古いバージョンのDistutilsと互換性があるように記述された、分類子を使用したsetup.pyの例です。

from distutils import core
kw = {'name': "Quixote",
      'version': "0.5.1",
      'description': "A highly Pythonic Web application framework",
      # ...
      }

if (hasattr(core, 'setup_keywords') and
    'classifiers' in core.setup_keywords):
    kw['classifiers'] = \
        ['Topic :: Internet :: WWW/HTTP :: Dynamic Content',
         'Environment :: No Input/Output (Daemon)',
         'Intended Audience :: Developers'],

core.setup(**kw)

分類子の完全なリストは、python setup.py register --list-classifiersを実行することで取得できます。

も参照してください

PEP 301 -Distutilsのパッケージインデックスとメタデータ
リチャードジョーンズによって書かれ、実装されています。


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.corefind_module()は、対応するモジュールオブジェクトを作成して返す単一のメソッドload_module(fullname)を持つローダーオブジェクトを返す必要があります。

したがって、Pythonの新しいインポートロジックの擬似コードは次のようになります(少し簡略化されています。詳細については、 PEP 302 を参照してください)。

for mp in sys.meta_path:
    loader = mp(fullname)
    if loader is not None:
        <module> = loader.load_module(fullname)

for path in sys.path:
    for hook in sys.path_hooks:
        try:
            importer = hook(path)
        except ImportError:
            # ImportError, so try the other path hooks
            pass
        else:
            loader = importer.find_module(fullname)
            <module> = loader.load_module(fullname)

# Not found!
raise ImportError

も参照してください

PEP 302 -新しいインポートフック
ジャストファンロッサムとポールムーアによって書かれました。 ジャストファンロッサムによって実装されました。


PEP 305:カンマ区切りファイル

コンマ区切りファイルは、データベースやスプレッドシートからデータをエクスポートするために頻繁に使用される形式です。 Python 2.3は、コンマ区切りファイル用のパーサーを追加します。

カンマ区切り形式は、一見すると一見シンプルです。

Costs,150,200,3.95

行を読んでline.split(',')に電話します。もっと簡単なことは何でしょうか。 しかし、コンマを含む可能性のある文字列データを投げると、事態はさらに複雑になります。

"Costs",150,200,3.95,"Includes taxes, shipping, and sundry items"

大きな醜い正規表現でこれを解析できますが、新しい csv パッケージを使用する方がはるかに簡単です。

import csv

input = open('datafile', 'rb')
reader = csv.reader(input)
for line in reader:
    print line

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は、標準化されたコードのリストを維持します。 個人使用のためのコードの範囲もあります。 現在、コードは指定されていません。

も参照してください

PEP 307 -pickleプロトコルの拡張
Guido vanRossumとTimPetersによって書かれ、実装されました。


拡張スライス

Python 1.4以降、スライス構文はオプションの3番目の「ステップ」または「ストライド」引数をサポートしています。 たとえば、これらはすべて有効なPython構文です:L[1:10:2]L[:-1:1]L[::-1]。 これは、3番目の引数を広範囲に使用するNumericalPythonの開発者の要求でPythonに追加されました。 ただし、Pythonの組み込みリスト、タプル、および文字列シーケンスタイプはこの機能をサポートしたことがないため、試してみると TypeError が発生します。 Michael Hudsonは、この欠点を修正するためのパッチを提供しました。

たとえば、インデックスさえも持つリストの要素を簡単に抽出できるようになりました。

>>> L = range(10)
>>> L[::2]
[0, 2, 4, 6, 8]

負の値は、同じリストのコピーを逆の順序で作成するためにも機能します。

>>> L[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

これは、タプル、配列、および文字列に対しても機能します。

>>> s='abcd'
>>> s[::2]
'ac'
>>> s[::-1]
'dcba'

リストや配列などの変更可能なシーケンスがある場合は、拡張スライスに割り当てたり削除したりできますが、拡張スライスへの割り当てと通常のスライスへの割り当てにはいくつかの違いがあります。 通常のスライスへの割り当てを使用して、シーケンスの長さを変更できます。

>>> a = range(3)
>>> a
[0, 1, 2]
>>> a[1:3] = [4, 5, 6]
>>> a
[0, 4, 5, 6]

拡張スライスはこれほど柔軟ではありません。 拡張スライスに割り当てる場合、ステートメントの右側のリストには、置き換えるスライスと同じ数のアイテムが含まれている必要があります。

>>> a = range(4)
>>> a
[0, 1, 2, 3]
>>> a[::2]
[0, 2]
>>> a[::2] = [0, -1]
>>> a
[0, 1, -1, 3]
>>> a[::2] = [0,1,2]
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
ValueError: attempt to assign sequence of size 3 to extended slice of size 2

削除はより簡単です:

>>> a = range(4)
>>> a
[0, 1, 2, 3]
>>> a[::2]
[0, 2]
>>> del a[::2]
>>> a
[1, 3]

組み込みシーケンスの__getitem__()メソッドにスライスオブジェクトを渡すこともできるようになりました。

>>> range(10).__getitem__(slice(0, 5, 2))
[0, 2, 4]

または、下付き文字で直接スライスオブジェクトを使用します。

>>> range(10)[slice(0, 5, 2)]
[0, 2, 4]

拡張スライスをサポートするシーケンスの実装を簡素化するために、スライスオブジェクトにメソッドindices(length)が追加されました。このメソッドは、シーケンスの長さを指定すると、 range(に直接渡すことができる(start, stop, step)タプルを返します。 )indices()は、省略された範囲外のインデックスを通常のスライスと一致する方法で処理します(この無害なフレーズは、紛らわしい詳細のウェルターを隠します!)。 このメソッドは、次のように使用することを目的としています。

class FakeSeq:
    ...
    def calc_item(self, i):
        ...
    def __getitem__(self, item):
        if isinstance(item, slice):
            indices = item.indices(len(self))
            return FakeSeq([self.calc_item(i) for i in range(*indices)])
        else:
            return self.calc_item(i)

この例から、組み込みのスライスオブジェクトがスライスタイプのタイプオブジェクトになり、関数ではなくなったことがわかります。 これは、 intstr などが同じ変更を受けた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 が発生します。

    >>> d = {1:2}
    >>> d
    {1: 2}
    >>> d.pop(4)
    Traceback (most recent call last):
      File "stdin", line 1, in ?
    KeyError: 4
    >>> d.pop(1)
    2
    >>> d.pop(1)
    Traceback (most recent call last):
      File "stdin", line 1, in ?
    KeyError: 'pop(): dictionary is empty'
    >>> d
    {}
    >>>

    新しいクラスメソッドdict.fromkeys(iterable, value)もあります。このメソッドは、提供されたイテレータ iterable から取得したキーと、すべての値を value に設定し、デフォルトでNone

    (Raymond Hettingerによって提供されたパッチ。)

    また、 dict()コンストラクターは、小さな辞書の作成を簡素化するためにキーワード引数を受け入れるようになりました。

    >>> dict(red=1, blue=2, green=3, black=4)
    {'blue': 2, 'black': 4, 'green': 3, 'red': 1}

    (Just van Rossumによる寄稿。)

  • assert ステートメントは__debug__フラグをチェックしなくなったため、__debug__に割り当ててアサーションを無効にすることはできなくなりました。 -O スイッチを指定してPythonを実行しても、アサーションを実行しないコードが生成されます。

  • 現在、ほとんどの型オブジェクトは呼び出し可能であるため、それらを使用して、関数、クラス、モジュールなどの新しいオブジェクトを作成できます。 (これは、 types モジュールで使用可能なtypeオブジェクトを使用できるようになったため、newモジュールが将来のPythonバージョンで非推奨になる可能性があることを意味します。)たとえば、新しいを作成できます。次のコードを持つモジュールオブジェクト:

    >>> import types
    >>> m = types.ModuleType('abc','docstring')
    >>> m
    <module 'abc' (built-in)>
    >>> m.__doc__
    'docstring'
  • 非推奨の処理中の機能を示すために、新しい警告 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__を出力すると、次の出力が得られます。

    >>> s = socket.socket()
    >>> s.__class__
    <type 'socket'>

    2.3では、次のようになります。

    >>> s.__class__
    <type '_socket.socket'>
  • 古いスタイルのクラスと新しいスタイルのクラスの間で指摘された非互換性の1つが削除されました。新しいスタイルのクラスの __ name __ 属性と __ bases __ 属性に割り当てることができるようになりました。 インスタンスの __ class __ 属性への割り当てに関連する制限に沿って、 __ bases __ に割り当てることができるものにいくつかの制限があります。

文字列の変更

  • in 演算子は、文字列に対して異なる動作をするようになりました。 以前は、 XY が文字列であるX in Yを評価する場合、 X は1文字のみでした。 これは変更されました。 X は任意の長さの文字列にすることができ、 XY のサブストリングである場合、X in YTrue を返します。 。 X が空の文字列の場合、結果は常に True になります。

    >>> 'ab' in 'abcd'
    True
    >>> 'ad' in 'abcd'
    False
    >>> '' in 'abcd'
    True

    これは部分文字列がどこから始まるかを教えてくれないことに注意してください。 その情報が必要な場合は、find()文字列メソッドを使用してください。

  • strip()lstrip()、およびrstrip()文字列メソッドに、削除する文字を指定するためのオプションの引数が追加されました。 デフォルトでは、すべての空白文字が削除されます。

    >>> '   abc '.strip()
    'abc'
    >>> '><><abc<><><>'.strip('<>')
    'abc'
    >>> '><><abc<><><>\n'.strip('<>')
    'abc<><><>\n'
    >>> u'\u4000\u4001abc\u4000'.strip(u'\u4000')
    u'\u4001abc'
    >>>

    (Simon Brunningによって提案され、WalterDörwaldによって実装されました。)

  • startswith()およびendswith()文字列メソッドは、 start および end パラメーターに負の数を受け入れるようになりました。

  • もう1つの新しい文字列メソッドはzfill()で、元々は string モジュールの関数です。 zfill()は、指定された幅になるまで、左側にゼロが付いた数値文字列を埋め込みます。 %演算子は、zfill()よりもさらに柔軟で強力であることに注意してください。

    >>> '45'.zfill(4)
    '0045'
    >>> '12345'.zfill(4)
    '12345'
    >>> 'goofy'.zfill(6)
    '0goofy'

    (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オブジェクトを作成します。

    ext = Extension("samp",
                    sources=["sampmodule.c"],
                    depends=["sample.h"])

    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スタイルのモードでは処理が続行されるため、オプションと引数を混在させることができます。 例えば:

    >>> getopt.getopt(['-f', 'filename', 'output', '-v'], 'f:v')
    ([('-f', 'filename')], ['output', '-v'])
    >>> getopt.gnu_getopt(['-f', 'filename', 'output', '-v'], 'f:v')
    ([('-f', 'filename'), ('-v', '')], ['output'])

    (PeterÅstrandによる寄稿。)

  • grppwd 、および resource モジュールは、拡張タプルを返すようになりました。

    >>> import grp
    >>> g = grp.getgrnam('amk')
    >>> g.gr_name, g.gr_gid
    ('amk', 500)
  • gzip モジュールは、2GiBを超えるファイルを処理できるようになりました。

  • 新しい heapq モジュールには、ヒープキューアルゴリズムの実装が含まれています。 ヒープは、すべてのインデックス kheap[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リストを使用する例を次に示します。

    >>> import heapq
    >>> heap = []
    >>> for item in [3, 7, 5, 11, 1]:
    ...    heapq.heappush(heap, item)
    ...
    >>> heap
    [1, 3, 5, 11, 7]
    >>> heapq.heappop(heap)
    1
    >>> heapq.heappop(heap)
    3
    >>> heap
    [5, 7, 11]

    (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()が呼び出されない限り、タイムスタンプは整数として表されます。

    >>> os.stat("/tmp").st_mtime
    1034791200
    >>> os.stat_float_times(True)
    >>> os.stat("/tmp").st_mtime
    1034791200.6335014

    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)までの任意の値にすることができます。 例えば:

    >>> days = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'St', 'Sn']
    >>> random.sample(days, 3)      # Choose 3 elements
    ['St', 'Sn', 'Th']
    >>> random.sample(days, 7)      # Choose 7 elements
    ['Tu', 'Th', 'Mo', 'We', 'St', 'Fr', 'Sn']
    >>> random.sample(days, 7)      # Choose 7 again
    ['We', 'Mo', 'Sn', 'Fr', 'Tu', 'St', 'Th']
    >>> random.sample(days, 8)      # Can't choose eight
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "random.py", line 414, in sample
          raise ValueError, "sample larger than population"
    ValueError: sample larger than population
    >>> random.sample(xrange(1,10000,2), 10)   # Choose ten odd nos. under 10000
    [3407, 3805, 1505, 7023, 2401, 2267, 9733, 3151, 8083, 9195]

    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()の上に構築されています。 例えば:

    >>> import textwrap
    >>> paragraph = "Not a whit, we defy augury: ... more text ..."
    >>> textwrap.wrap(paragraph, 60)
    ["Not a whit, we defy augury: there's a special providence in",
     "the fall of a sparrow. If it be now, 'tis not to come; if it",
     ...]
    >>> print textwrap.fill(paragraph, 35)
    Not a whit, we defy augury: there's
    a special providence in the fall of
    a sparrow. If it be now, 'tis not
    to come; if it be not to come, it
    will be now; if it be not now, yet
    it will come: the readiness is all.
    >>>

    このモジュールには、テキストの折り返し戦略を実際に実装するTextWrapperクラスも含まれています。 TextWrapperクラスとwrap()およびfill()関数はどちらも、フォーマットを微調整するためのいくつかの追加のキーワード引数をサポートしています。 詳細については、モジュールのドキュメントを参照してください。 (Greg Wardによる寄稿)

  • threadおよび threading モジュールには、threadの何もしない実装を提供するコンパニオンモジュールdummy_threadおよび dummy_threading が含まれるようになりました。 ]スレッドがサポートされていないプラットフォーム用のモジュールのインターフェース。 目的は、次のコードを先頭に配置することにより、スレッド対応モジュール(がスレッドに依存しないモジュール)を単純化することです。

    try:
        import threading as _threading
    except ImportError:
        import dummy_threading as _threading

    この例では、_threadingがモジュール名として使用され、使用されているモジュールが必ずしも実際のスレッドモジュールではないことを明確にしています。 コードは、スレッドがサポートされているかどうかに関係なく、_threadingの関数を呼び出してクラスを使用できるため、 if ステートメントを回避し、コードを少し明確にします。 このモジュールは、マルチスレッドコードをスレッドなしで魔法のように実行することはありません。 別のスレッドが戻るのを待つか、何かをするのを待つコードは、単に永久にハングします。

  • time モジュールのstrptime()関数は、プラットフォームCライブラリのstrptime()実装を使用しているため、長い間煩わしく、プラットフォームによっては奇妙なバグが発生することがあります。 Brett Cannonは、純粋なPythonで記述され、すべてのプラットフォームで同じように動作するポータブル実装を提供しました。

  • 新しい timeit モジュールは、Pythonコードのスニペットの実行にかかる時間を測定するのに役立ちます。 timeit.pyファイルは、コマンドラインから直接実行することも、モジュールのTimerクラスをインポートして直接使用することもできます。 空のUnicode文字列を追加するか、unicode()関数を使用して、8ビット文字列をUnicodeに変換する方が速いかどうかを判断する短い例を次に示します。

    import timeit
    
    timer1 = timeit.Timer('unicode("abc")')
    timer2 = timeit.Timer('"abc" + u""')
    
    # Run three trials
    print timer1.repeat(repeat=3, number=100000)
    print timer2.repeat(repeat=3, number=100000)
    
    # On my laptop this outputs:
    # [0.36831796169281006, 0.37441694736480713, 0.35304892063140869]
    # [0.17574405670166016, 0.18193507194519043, 0.17565798759460449]
  • 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に設定することで、古い動作を復元できます。

    import Tkinter
    Tkinter.wantobjects = 0

    この変更によって引き起こされた破損は、バグとして報告する必要があります。

  • UserDictモジュールには、新しいDictMixinクラスがあります。このクラスは、最小のマッピングインターフェイスを既に持っているクラスのすべてのディクショナリメソッドを定義します。 これにより、 shelve モジュールのクラスなど、辞書の代わりに使用できる必要のあるクラスの記述が大幅に簡素化されます。

    ミックスインをスーパークラスとして追加すると、クラスが__getitem__()__setitem__()__delitem__()、およびkeys()を定義するたびに、完全な辞書インターフェイスが提供されます。 例えば:

    >>> import UserDict
    >>> class SeqDict(UserDict.DictMixin):
    ...     """Dictionary lookalike implemented with lists."""
    ...     def __init__(self):
    ...         self.keylist = []
    ...         self.valuelist = []
    ...     def __getitem__(self, key):
    ...         try:
    ...             i = self.keylist.index(key)
    ...         except ValueError:
    ...             raise KeyError
    ...         return self.valuelist[i]
    ...     def __setitem__(self, key, value):
    ...         try:
    ...             i = self.keylist.index(key)
    ...             self.valuelist[i] = value
    ...         except ValueError:
    ...             self.keylist.append(key)
    ...             self.valuelist.append(value)
    ...     def __delitem__(self, key):
    ...         try:
    ...             i = self.keylist.index(key)
    ...         except ValueError:
    ...             raise KeyError
    ...         self.keylist.pop(i)
    ...         self.valuelist.pop(i)
    ...     def keys(self):
    ...         return list(self.keylist)
    ...
    >>> s = SeqDict()
    >>> dir(s)      # See that other dictionary methods are implemented
    ['__cmp__', '__contains__', '__delitem__', '__doc__', '__getitem__',
     '__init__', '__iter__', '__len__', '__module__', '__repr__',
     '__setitem__', 'clear', 'get', 'has_key', 'items', 'iteritems',
     'iterkeys', 'itervalues', 'keylist', 'keys', 'pop', 'popitem',
     'setdefault', 'update', 'valuelist', 'values']

    (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)の間で変換するために使用できます。

    >{}>{}> u"www.Alliancefrançaise.nu".encode("idna")
    'www.xn--alliancefranaise-npb.nu'

    socket モジュールも拡張され、Unicodeホスト名をCライブラリに渡す前にACEバージョンに透過的に変換するようになりました。 httplibftplib )などのホスト名を処理するモジュールもUnicodeホスト名をサポートします。 httplibは、ドメイン名のACEバージョンを使用してHTTP Hostヘッダーも送信します。 urllib は、URLのpath部分がASCIIのみである限り、非ASCIIホスト名のUnicodeURLをサポートします。

    この変更を実装するために、 stringprep モジュール、mkstringprepツール、およびpunycodeエンコーディングが追加されました。

日付/時刻タイプ

タイムスタンプの表現に適した日付と時刻のタイプが datetime モジュールとして追加されました。 これらのタイプは、さまざまなカレンダーや多くの高度な機能をサポートしておらず、時間を表す基本に固執しています。

3つの主要なタイプは次のとおりです。date、日、月、および年を表します。 時間、時、分、秒で構成されます。 datetime には、datetime の両方のすべての属性が含まれています。 2つの時点の違いを表すtimedeltaクラスもあり、タイムゾーンロジックは抽象tzinfoクラスを継承するクラスによって実装されます。

dateおよび time のインスタンスを作成するには、適切なコンストラクターにキーワード引数を指定します。 datetime.date(year=1972, month=10, day=15)、またはいくつかのクラスメソッドの1つを使用する。 たとえば、date.today()クラスメソッドは現在のローカル日付を返します。

作成されると、日付/時刻クラスのインスタンスはすべて不変になります。 オブジェクトからフォーマットされた文字列を生成するには、いくつかの方法があります。

>>> import datetime
>>> now = datetime.datetime.now()
>>> now.isoformat()
'2002-12-30T21:27:03.994956'
>>> now.ctime()  # Only available on date, datetime
'Mon Dec 30 21:27:03 2002'
>>> now.strftime('%Y %d %b')
'2002 30 Dec'

replace()メソッドを使用すると、dateまたは datetime インスタンスの1つ以上のフィールドを変更して、新しいインスタンスを返すことができます。

>>> d = datetime.datetime.now()
>>> d
datetime.datetime(2002, 12, 30, 22, 15, 38, 827738)
>>> d.replace(year=2001, hour = 12)
datetime.datetime(2001, 12, 30, 12, 15, 38, 827738)
>>>

インスタンスを比較、ハッシュ、および文字列に変換できます(結果はisoformat()の結果と同じです)。 dateインスタンスと datetime インスタンスは、互いに減算して、timedeltaインスタンスに追加できます。 欠落している最大の機能は、文字列を解析してdateまたは datetime を取得するための標準ライブラリサポートがないことです。

詳細については、モジュールのリファレンスドキュメントを参照してください。 (Tim Petersによる寄稿。)


optparseモジュール

getopt モジュールは、コマンドライン引数の単純な解析を提供します。 新しい optparse モジュール(元々はOptikという名前)は、Unixの規則に従い、--helpの出力を自動的に作成し、さまざまなオプションに対してさまざまなアクションを実行できる、より複雑なコマンドライン解析を提供します。

まず、OptionParserのインスタンスを作成し、プログラムのオプションを指定します。

import sys
from optparse import OptionParser

op = OptionParser()
op.add_option('-i', '--input',
              action='store', type='string', dest='input',
              help='set input filename')
op.add_option('-l', '--length',
              action='store', type='int', dest='length',
              help='set maximum length of output')

コマンドラインの解析は、parse_args()メソッドを呼び出すことによって実行されます。

options, args = op.parse_args(sys.argv[1:])
print options
print 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オブジェクトを割り当てるための特別な関数の別のファミリがあります。

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でのみ新しいキーワードを使用することです。

    from distutils import core
    
    kw = {'sources': 'foo.c', ...}
    if hasattr(core, 'get_distutil_options'):
        kw['depends'] = ['foo.h']
    ext = Extension(**kw)
  • 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。