Python2.6の新機能
- 著者
- 午前 Kuchling(amk.caのamk)
この記事では、2008年10月1日にリリースされたPython2.6の新機能について説明します。 リリーススケジュールは、 PEP 361 に記載されています。
Python 2.6の主要なテーマは、言語の主要な再設計であるPython3.0への移行パスを準備することです。 可能な限り、Python 2.6は3.0の新しい機能と構文を組み込んでいますが、古い機能や構文を削除しないことで既存のコードとの互換性を維持しています。 それが不可能な場合、Python 2.6は可能なことを実行しようとし、future_builtins
モジュールと-3
スイッチに互換性関数を追加して、3.0でサポートされなくなる使用法について警告します。
マルチプロセッシングモジュールや json モジュールなど、いくつかの重要な新しいパッケージが標準ライブラリに追加されましたが、一部のPython3.0に関連しない新機能は多くありません。仕方。
Python 2.6では、ソース全体で多くの改善とバグ修正も行われています。 変更ログを検索すると、Python 2.5と2.6の間で、259個のパッチが適用され、612個のバグが修正されていることがわかります。 どちらの数値も過小評価される可能性があります。
この記事では、新機能の完全な仕様を提供するのではなく、便利な概要を提供します。 詳細については、Python2.6のドキュメントを参照してください。 設計と実装の理論的根拠を理解したい場合は、特定の新機能についてPEPを参照してください。 可能な限り、「Pythonの新機能」は各変更のバグ/パッチアイテムにリンクしています。
Python 3.0
Pythonバージョン2.6と3.0の開発サイクルは同期され、両方のバージョンのアルファリリースとベータリリースは同じ日に行われました。 3.0の開発は、2.6の多くの機能に影響を与えました。
Python 3.0は、2.xシリーズとの互換性を損なうPythonの広範囲にわたる再設計です。 これは、既存のPythonコードをPython 3.0で実行するには、変換が必要になることを意味します。 ただし、3.0でのすべての変更が必ずしも互換性を損なうわけではありません。 新しい機能によって既存のコードが破損しない場合は、2.6にバックポートされており、このドキュメントの適切な場所で説明されています。 3.0から派生した機能の一部は次のとおりです。
- オブジェクトを複素数に変換するための
__complex__()
メソッド。 - 例外をキャッチするための代替構文:
except TypeError as exc
。 - 組み込みの
reduce()
関数の同義語として functools.reduce()が追加されました。
Python 3.0は、いくつかの新しい組み込み関数を追加し、いくつかの既存の組み込み関数のセマンティクスを変更します。 bin()などの3.0の新機能は、Python 2.6に追加されただけですが、既存の組み込み関数は変更されていません。 代わりに、future_builtins
モジュールには新しい3.0セマンティクスのバージョンがあります。 3.0と互換性があるように記述されたコードは、必要に応じてfrom future_builtins import hex, map
を実行できます。
新しいコマンドラインスイッチ-3
は、Python3.0で削除される機能に関する警告を有効にします。 このスイッチを使用してコードを実行すると、コードを3.0に移植するために必要な作業量を確認できます。 このスイッチの値は、Pythonコードではブール変数sys.py3kwarning
として、C拡張コードではPy_Py3kWarningFlag
として使用できます。
開発プロセスの変更
2.6の開発中に、Python開発プロセスに2つの重要な変更が加えられました。SourceForgeの課題追跡システムからカスタマイズされたRoundupインストールに切り替え、ドキュメントがLaTeXからreStructuredTextに変換されました。
新しい課題トラッカー:まとめ
長い間、Python開発者はSourceForgeのバグトラッカーにますます悩まされてきました。 SourceForgeのホスト型ソリューションでは、多くのカスタマイズは許可されていません。 たとえば、問題のライフサイクルをカスタマイズすることはできませんでした。
そのため、Python Software Foundationのインフラストラクチャ委員会は、問題追跡システムの募集を投稿し、ボランティアにさまざまな製品をセットアップして、SourceForgeからバグやパッチの一部をインポートするように依頼しました。 Jira 、 Launchpad 、 Roundup 、および Trac の4つの異なるトラッカーを調べました。 委員会は最終的に、2人の候補者としてJiraとRoundupを決定しました。 Jiraは、フリーソフトウェアプロジェクトに無料のホストインスタンスを提供する商用製品です。 Roundupはオープンソースプロジェクトであり、ボランティアがそれを管理し、サーバーがそれをホストする必要があります。
ボランティアの募集を投稿した後、新しいラウンドアップインストールが https://bugs.python.org にセットアップされました。 Roundupの1つのインストールで複数のトラッカーをホストでき、このサーバーはJythonおよびPythonWebサイトの課題トラッカーもホストするようになりました。 将来的には他の用途もきっと見つかるでしょう。 可能な場合、このエディションの「Pythonの新機能」は、変更ごとのバグ/パッチ項目にリンクしています。
Pythonバグトラッカーのホスティングは、南アフリカのステレンボッシュの Upfront Systems から提供されています。 MartinvonLöwisはSourceForgeから既存のバグやパッチをインポートすることに多大な努力を払っています。 このインポート操作の彼のスクリプトは http://svn.python.org/view/tracker/importer/ にあり、SourceForgeからRoundupに移行したい他のプロジェクトに役立つ可能性があります。
も参照してください
- https://bugs.python.org
- Pythonバグトラッカー。
- http://bugs.jython.org :
- Jythonバグトラッカー。
- http://roundup.sourceforge.net/
- ラウンドアップのダウンロードとドキュメント。
- http://svn.python.org/view/tracker/importer/
- MartinvonLöwisの変換スクリプト。
新しいドキュメント形式:Sphinxを使用したreStructuredText
Pythonのドキュメントは、プロジェクトが1989年頃に開始されて以来、LaTeXを使用して作成されました。 1980年代と1990年代初頭には、ほとんどのドキュメントはオンラインで表示されるのではなく、後の調査のために印刷されました。 LaTeXは、マークアップの基本的なルールを習得した後でも簡単に記述できる魅力的な印刷出力を提供するため、広く使用されていました。
現在でもLaTeXは印刷用の出版物の執筆に使用されていますが、プログラミングツールの展望は変化しています。 大量のドキュメントを印刷しなくなりました。 代わりに、オンラインで閲覧し、HTMLがサポートする最も重要な形式になっています。 残念ながら、LaTeXからHTMLへの変換はかなり複雑で、FredLです。 長年のPythonドキュメントエディタであるDrakeJr。は、変換プロセスの保守に多くの時間を費やしました。 時折、ドキュメントをSGMLとその後のXMLに変換することを提案する人もいますが、適切な変換を実行することは主要なタスクであり、仕事を完了するために必要な時間を誰もコミットしませんでした。
2.6の開発サイクル中、Georg Brandlは、ドキュメントを処理するための新しいツールチェーンの構築に多大な労力を費やしました。 結果のパッケージはSphinxと呼ばれ、 http://sphinx-doc.org/から入手できます。
SphinxはHTML出力に重点を置き、魅力的なスタイルの最新のHTMLを生成します。 印刷出力は、LaTeXへの変換を通じて引き続きサポートされます。 入力形式はreStructuredTextです。これは、Pythonコミュニティで一般的に使用されているカスタム拡張機能とディレクティブをサポートするマークアップ構文です。
Sphinxは、書き込みに使用できるスタンドアロンパッケージであり、他のほぼ20のプロジェクト( Sphinx Webサイトにリストされています)は、ドキュメントツールとしてSphinxを採用しています。
も参照してください
- Pythonの文書化
- Pythonのドキュメントの書き方を説明します。
- スフィンクス
- Sphinxツールチェーンのドキュメントとコード。
- Docutils
- 基礎となるreStructuredTextパーサーとツールセット。
PEP 343:「with」ステートメント
以前のバージョンのPython2.5では、オプション機能として「 with 」ステートメントが追加され、from __future__ import with_statement
ディレクティブで有効になりました。 2.6では、ステートメントを特別に有効にする必要がなくなりました。 これは、with
が常にキーワードになることを意味します。 このセクションの残りの部分は、「Python2.5の新機能」ドキュメントの対応するセクションのコピーです。 Python2.5の「with
」ステートメントに精通している場合は、このセクションをスキップできます。
' with 'ステートメントは、以前はtry...finally
ブロックを使用して、クリーンアップコードが確実に実行されるようにするコードを明確にします。 このセクションでは、一般的に使用されるステートメントについて説明します。 次のセクションでは、実装の詳細を調べ、このステートメントで使用するオブジェクトを作成する方法を示します。
' with 'ステートメントは、基本構造が次の制御フロー構造です。
with expression [as variable]:
with-block
式が評価され、コンテキスト管理プロトコルをサポートするオブジェクトが生成されます(つまり、__enter__()
メソッドと__exit__()
メソッドがあります)。
オブジェクトの__enter__()
は、 with-block が実行される前に呼び出されるため、セットアップコードを実行できます。 また、指定されている場合は、変数という名前にバインドされた値を返す場合があります。 (変数には式の結果が割り当てられていないことに注意してください。)
with-block の実行が終了すると、ブロックで例外が発生した場合でも、オブジェクトの__exit__()
メソッドが呼び出されるため、クリーンアップコードを実行できます。
一部の標準Pythonオブジェクトは、コンテキスト管理プロトコルをサポートするようになり、「 with 」ステートメントで使用できます。 ファイルオブジェクトはその一例です。
with open('/etc/passwd', 'r') as f:
for line in f:
print line
... more processing code ...
このステートメントが実行された後、 for ループがブロックの途中で例外を発生させた場合でも、 f のファイルオブジェクトは自動的に閉じられます。
threading モジュールのロックおよび条件変数は、「 with 」ステートメントもサポートします。
lock = threading.Lock()
with lock:
# Critical section of code
...
ロックはブロックが実行される前に取得され、ブロックが完了すると常に解放されます。
decimal モジュールのlocalcontext()
関数を使用すると、現在の10進数コンテキストを簡単に保存および復元できます。これにより、計算に必要な精度と丸め特性がカプセル化されます。
from decimal import Decimal, Context, localcontext
# Displays with default precision of 28 digits
v = Decimal('578')
print v.sqrt()
with localcontext(Context(prec=16)):
# All code in this block uses a precision of 16 digits.
# The original context is restored on exiting the block.
print v.sqrt()
コンテキストマネージャーの作成
内部的には、「 with 」ステートメントはかなり複雑です。 ほとんどの人は、既存のオブジェクトと一緒に「with
」のみを使用し、これらの詳細を知る必要がないため、必要に応じてこのセクションの残りの部分をスキップできます。 新しいオブジェクトの作成者は、基礎となる実装の詳細を理解する必要があり、読み続ける必要があります。
コンテキスト管理プロトコルの概要は次のとおりです。
- 式が評価され、「コンテキストマネージャー」と呼ばれるオブジェクトが生成されます。 コンテキストマネージャには、
__enter__()
および__exit__()
メソッドが必要です。 - コンテキストマネージャの
__enter__()
メソッドが呼び出されます。 返された値は VAR に割り当てられます。as VAR
句が存在しない場合、値は単に破棄されます。 - BLOCK のコードが実行されます。
- BLOCK で例外が発生した場合、コンテキストマネージャーの
__exit__()
メソッドが3つの引数、例外の詳細(type, value, traceback
、 sys.exc_infoによって返されるのと同じ値)で呼び出されます。 ()。例外が発生しなかった場合はNone
にすることもできます)。 メソッドの戻り値は、例外が再発生するかどうかを制御します。偽の値があると、例外が再発生し、True
によって例外が抑制されます。 ' with 'ステートメントを含むコードの作成者が何かがうまくいかなかったことに気付くことは決してないので、例外を抑制したいと思うことはめったにありません。 - BLOCK で例外が発生しなかった場合でも、
__exit__()
メソッドは呼び出されますが、 type 、 value 、および traceback [ X136X]はすべてNone
です。
例を考えてみましょう。 詳細なコードは示しませんが、トランザクションをサポートするデータベースに必要なメソッドのみをスケッチします。
(データベースの用語に慣れていない人のために:データベースへの一連の変更はトランザクションにグループ化されます。 トランザクションは、すべての変更がデータベースに書き込まれることを意味するコミット、または変更がすべて破棄されてデータベースが変更されないことを意味するロールバックのいずれかです。 詳細については、データベースの教科書を参照してください。)
データベース接続を表すオブジェクトがあると仮定しましょう。 私たちの目標は、ユーザーが次のようなコードを記述できるようにすることです。
db_connection = DatabaseConnection()
with db_connection as cursor:
cursor.execute('insert into ...')
cursor.execute('delete from ...')
# ... more operations ...
ブロック内のコードが問題なく実行された場合はトランザクションをコミットするか、例外がある場合はロールバックする必要があります。 DatabaseConnection
の基本的なインターフェイスは次のとおりです。
class DatabaseConnection:
# Database interface
def cursor(self):
"Returns a cursor object and starts a new transaction"
def commit(self):
"Commits current transaction"
def rollback(self):
"Rolls back current transaction"
__enter__()
メソッドは非常に簡単で、新しいトランザクションを開始するだけで済みます。 このアプリケーションの場合、結果のカーソルオブジェクトは有用な結果になるため、メソッドはそれを返します。 次に、ユーザーはas cursor
を ' with 'ステートメントに追加して、カーソルを変数名にバインドできます。
class DatabaseConnection:
...
def __enter__(self):
# Code to start a new transaction
cursor = self.cursor()
return cursor
__exit__()
メソッドは、ほとんどの作業を実行する必要があるため、最も複雑です。 メソッドは、例外が発生したかどうかを確認する必要があります。 例外がなかった場合、トランザクションはコミットされます。 例外が発生した場合、トランザクションはロールバックされます。
以下のコードでは、実行は関数の終わりから外れ、デフォルト値のNone
が返されます。 None
はfalseであるため、例外は自動的に再発生します。 必要に応じて、より明示的に、マークされた場所に return ステートメントを追加することもできます。
class DatabaseConnection:
...
def __exit__(self, type, value, tb):
if tb is None:
# No exception, so commit
self.commit()
else:
# Exception occurred, so rollback.
self.rollback()
# return False
contextlibモジュール
contextlib モジュールは、「 with 」ステートメントで使用するオブジェクトを作成するときに役立ついくつかの関数とデコレータを提供します。
デコレータはcontextmanager()
と呼ばれ、新しいクラスを定義する代わりに、単一のジェネレータ関数を記述できます。 ジェネレータは正確に1つの値を生成する必要があります。 yield までのコードは、__enter__()
メソッドとして実行され、生成される値は、 with [の変数にバインドされるメソッドの戻り値になります。 X184X] 'ステートメントのas
句(ある場合)。 yield
の後のコードは、__exit__()
メソッドで実行されます。 ブロックで発生した例外は、yield
ステートメントによって発生します。
このデコレータを使用すると、前のセクションのデータベースの例は次のように記述できます。
from contextlib import contextmanager
@contextmanager
def db_transaction(connection):
cursor = connection.cursor()
try:
yield cursor
except:
connection.rollback()
raise
else:
connection.commit()
db = DatabaseConnection()
with db_transaction(db) as cursor:
...
contextlib モジュールには、多数のコンテキストマネージャーを組み合わせたnested(mgr1, mgr2, ...)
関数もあるため、ネストされた ' with 'ステートメントを記述する必要はありません。 この例では、単一の 'with
'ステートメントがデータベーストランザクションを開始し、スレッドロックを取得します。
lock = threading.Lock()
with nested (db_transaction(db), lock) as (cursor, locked):
...
最後に、closing()
関数は、変数にバインドできるように引数を返し、ブロックの最後で引数の.close()
メソッドを呼び出します。
import urllib, sys
from contextlib import closing
with closing(urllib.urlopen('http://www.yahoo.com')) as f:
for line in f:
sys.stdout.write(line)
も参照してください
- PEP 343 -「with」ステートメント
- グイドヴァンロッサムとニックコグランによって書かれたPEP。 Mike Bland、Guido van Rossum、およびNealNorwitzによって実装されました。 PEPは、「 with 」ステートメント用に生成されたコードを示しています。これは、ステートメントがどのように機能するかを学習するのに役立ちます。
contextlib モジュールのドキュメント。
PEP 366:メインモジュールからの明示的な相対インポート
Pythonの -m スイッチを使用すると、モジュールをスクリプトとして実行できます。 パッケージ内にあるモジュールを実行すると、相対インポートが正しく機能しませんでした。
Python 2.6の修正により、モジュールに __ package __ 属性が追加されます。 この属性が存在する場合、相対インポートは、 __ name __ 属性ではなく、この属性の値に相対的です。
PEP 302スタイルのインポーターは、必要に応じて __ package __ を設定できます。 -m スイッチを実装する runpy モジュールがこれを実行するようになったため、パッケージ内から実行されるスクリプトで相対インポートが正しく機能するようになりました。
PEP 370:ユーザーごとのsite-packagesディレクトリ
Pythonを実行すると、モジュール検索パスsys.path
には通常、パスが"site-packages"
で終わるディレクトリが含まれます。 このディレクトリは、マシンまたは特定のサイトのインストールを使用するすべてのユーザーが利用できる、ローカルにインストールされたパッケージを保持することを目的としています。
Python 2.6では、ユーザー固有のサイトディレクトリの規則が導入されています。 ディレクトリはプラットフォームによって異なります。
- UnixおよびMacOS X:
~/.local/
- Windows:
%APPDATA%/Python
このディレクトリ内には、Unix / MacOSのlib/python2.6/site-packages
やWindowsのPython26/site-packages
など、バージョン固有のサブディレクトリがあります。
デフォルトのディレクトリが気に入らない場合は、環境変数で上書きできます。 PYTHONUSERBASE は、この機能をサポートするすべてのPythonバージョンで使用されるルートディレクトリを設定します。 Windowsでは、 APPDATA
環境変数を設定することにより、アプリケーション固有のデータのディレクトリを変更できます。 Pythonインストール用にsite.py
ファイルを変更することもできます。
この機能は、 -s オプションを指定してPythonを実行するか、 PYTHONNOUSERSITE 環境変数を設定することで、完全に無効にできます。
PEP 371:multiprocessingパッケージ
新しい multiprocessing パッケージを使用すると、Pythonプログラムは、計算を実行して結果を親に返す新しいプロセスを作成できます。 親プロセスと子プロセスは、キューとパイプを使用して通信し、ロックとセマフォを使用して操作を同期し、データの単純な配列を共有できます。
マルチプロセッシングモジュールは、スレッドの代わりにプロセスを使用するスレッドモジュールの正確なエミュレーションとして始まりました。 その目標はPython2.6へのパスに沿って破棄されましたが、モジュールの一般的なアプローチは依然として類似しています。 基本クラスはProcess
であり、呼び出し可能なオブジェクトと引数のコレクションが渡されます。 start()
メソッドは、サブプロセスで実行中の呼び出し可能オブジェクトを設定します。その後、is_alive()
メソッドを呼び出して、サブプロセスがまだ実行されているかどうかを確認し、join()
メソッドを呼び出して終了するプロセス。
これは、サブプロセスが階乗を計算する簡単な例です。 計算を行う関数は奇妙に書かれているため、入力引数が4の倍数の場合はかなり時間がかかります。
import time
from multiprocessing import Process, Queue
def factorial(queue, N):
"Compute a factorial."
# If N is a multiple of 4, this function will take much longer.
if (N % 4) == 0:
time.sleep(.05 * N/4)
# Calculate the result
fact = 1L
for i in range(1, N+1):
fact = fact * i
# Put the result on the queue
queue.put(fact)
if __name__ == '__main__':
queue = Queue()
N = 5
p = Process(target=factorial, args=(queue, N))
p.start()
p.join()
result = queue.get()
print 'Factorial', N, '=', result
キューは、階乗の結果を伝達するために使用されます。 Queue オブジェクトはグローバル変数に格納されます。 子プロセスは、子が作成されたときの変数の値を使用します。 Queue であるため、親と子はオブジェクトを使用して通信できます。 (親がグローバル変数の値を変更した場合、子の値は影響を受けません。その逆も同様です。)
他の2つのクラス、Pool
とManager
は、より高いレベルのインターフェースを提供します。 Pool
は固定数のワーカープロセスを作成し、apply()
またはapply_async()
を呼び出して単一のリクエストを追加し、 mapを呼び出すことで、リクエストをワーカーに配布できます。 ()またはmap_async()
を使用して、いくつかのリクエストを追加します。 次のコードは、Pool
を使用して、5つのワーカープロセスにリクエストを分散し、結果のリストを取得します。
from multiprocessing import Pool
def factorial(N, dictionary):
"Compute a factorial."
...
p = Pool(5)
result = p.map(factorial, range(1, 1000, 10))
for v in result:
print v
これにより、次の出力が生成されます。
1
39916800
51090942171709440000
8222838654177922817725562880000000
33452526613163807108170062053440751665152000000000
...
もう1つの高レベルインターフェイスであるManager
クラスは、Pythonデータ構造のマスターコピーを保持できる別個のサーバープロセスを作成します。 その後、他のプロセスは、プロキシオブジェクトを使用してこれらのデータ構造にアクセスして変更できます。 次の例では、 dict()メソッドを呼び出して共有ディクショナリを作成します。 次に、ワーカープロセスが値をディクショナリに挿入します。 (ロックは自動的には行われません。この例では関係ありません。 Manager
のメソッドには、共有ロックを作成するためのLock()
、RLock()
、およびSemaphore()
も含まれます。)
import time
from multiprocessing import Pool, Manager
def factorial(N, dictionary):
"Compute a factorial."
# Calculate the result
fact = 1L
for i in range(1, N+1):
fact = fact * i
# Store result in dictionary
dictionary[N] = fact
if __name__ == '__main__':
p = Pool(5)
mgr = Manager()
d = mgr.dict() # Create shared dictionary
# Run tasks using the pool
for N in range(1, 1000, 10):
p.apply_async(factorial, (N, d))
# Mark pool as closed -- no more tasks can be added.
p.close()
# Wait for tasks to exit
p.join()
# Output results
for k, v in sorted(d.items()):
print k, v
これにより、次の出力が生成されます。
1 1
11 39916800
21 51090942171709440000
31 8222838654177922817725562880000000
41 33452526613163807108170062053440751665152000000000
51 15511187532873822802242430164693032110632597200169861120000...
も参照してください
マルチプロセッシングモジュールのドキュメント。
- PEP 371 -マルチプロセッシングパッケージの追加
- JesseNollerとRichardOudkerkによって書かれたPEP。 リチャード・オウドケルクとジェシー・ノラーによって実装されました。
PEP 3101:高度な文字列フォーマット
Python 3.0では、%演算子は、より強力な文字列フォーマットメソッド format()によって補完されます。 str.format()メソッドのサポートがPython2.6にバックポートされました。
2.6では、8ビット文字列とUnicode文字列の両方に .format()メソッドがあり、文字列をテンプレートとして扱い、フォーマットする引数を取ります。 書式設定テンプレートでは、中括弧( {、} )を特殊文字として使用します。
>>> # Substitute positional argument 0 into the string.
>>> "User ID: {0}".format("root")
'User ID: root'
>>> # Use the named keyword arguments
>>> "User ID: {uid} Last seen: {last_login}".format(
... uid="root",
... last_login = "5 Mar 2008 07:20")
'User ID: root Last seen: 5 Mar 2008 07:20'
中括弧は、2倍にすることでエスケープできます。
>>> "Empty dict: {{}}".format()
"Empty dict: {}"
フィールド名は、{0}
、{1}
などの位置引数を示す整数にすることができます。 またはキーワード引数の名前。 属性を読み取ったり、辞書キーにアクセスしたりする複合フィールド名を指定することもできます。
>>> import sys
>>> print 'Platform: {0.platform}\nPython version: {0.version}'.format(sys)
Platform: darwin
Python version: 2.6a1+ (trunk:61261M, Mar 5 2008, 20:29:41)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)]'
>>> import mimetypes
>>> 'Content-type: {0[.mp4]}'.format(mimetypes.types_map)
'Content-type: video/mp4'
[.mp4]
などの辞書スタイルの表記を使用する場合は、文字列を引用符で囲む必要がないことに注意してください。 .mp4
をキーとして使用して値を検索します。 数字で始まる文字列は整数に変換されます。 フォーマット文字列内にこれ以上複雑な式を書くことはできません。
これまで、結果の文字列に置き換えるフィールドを指定する方法を示してきました。 使用される正確なフォーマットは、コロンの後にフォーマット指定子を追加することによっても制御できます。 例えば:
>>> # Field 0: left justify, pad to 15 characters
>>> # Field 1: right justify, pad to 6 characters
>>> fmt = '{0:15} ${1:>6}'
>>> fmt.format('Registration', 35)
'Registration $ 35'
>>> fmt.format('Tutorial', 50)
'Tutorial $ 50'
>>> fmt.format('Banquet', 125)
'Banquet $ 125'
フォーマット指定子は、ネストを通じて他のフィールドを参照できます。
>>> fmt = '{0:{1}}'
>>> width = 15
>>> fmt.format('Invoice #1234', width)
'Invoice #1234 '
>>> width = 35
>>> fmt.format('Invoice #1234', width)
'Invoice #1234 '
希望の幅内のフィールドの配置を指定できます。
キャラクター | 効果 |
---|---|
<(デフォルト) | 左揃え |
> | 右揃え |
^ | 中心 |
= | (数値タイプのみ)記号の後にパッドを入れます。 |
フォーマット指定子には、値のフォーマット方法を制御するプレゼンテーションタイプを含めることもできます。 たとえば、浮動小数点数は、一般的な数または指数表記でフォーマットできます。
>>> '{0:g}'.format(3.75)
'3.75'
>>> '{0:e}'.format(3.75)
'3.750000e+00'
さまざまな種類のプレゼンテーションを利用できます。 完全なリストについては、2.6のドキュメントを参照してください。 ここにサンプルがあります:
b
|
バイナリ。 2を底とする数値を出力します。 |
c
|
キャラクター。 印刷する前に、整数を対応するUnicode文字に変換します。 |
d
|
10進整数。 基数10の数値を出力します。 |
o
|
8進数形式。 基数8の数値を出力します。 |
x
|
16進形式。 9を超える桁には小文字を使用して、基数16の数値を出力します。 |
e
|
指数表記。 指数を示すために文字「e」を使用して科学的記数法で数値を出力します。 |
g
|
一般的な形式。 これにより、数値が大きすぎる場合を除いて、固定小数点数値として出力されます。大きすぎる場合は、「e」指数表記に切り替わります。 |
n
|
番号。 これは、現在のロケール設定を使用して適切な数字区切り文字を挿入することを除いて、「g」(浮動小数点数の場合)または「d」(整数の場合)と同じです。 |
%
|
パーセンテージ。 数値に100を掛けて、固定( 'f')形式で表示し、その後にパーセント記号を付けます。 |
クラスとタイプは、__format__()
メソッドを定義して、それらのフォーマット方法を制御できます。 これは、フォーマット指定子という1つの引数を受け取ります。
def __format__(self, format_spec):
if isinstance(format_spec, unicode):
return unicode(str(self))
else:
return str(self)
単一の値をフォーマットする format()ビルトインもあります。 提供された指定子を使用して、型の__format__()
メソッドを呼び出します。
>>> format(75.6564, '.2f')
'75.66'
も参照してください
- フォーマット文字列構文
- フォーマットフィールドのリファレンスドキュメント。
- PEP 3101 -高度な文字列フォーマット
- タリンによって書かれたPEP。 エリック・スミスによって実装されました。
PEP 3105:print機能として
print
ステートメントは、Python3.0では print()関数になります。 print()を関数にすると、def print(...)
を実行するか、別の場所から新しい関数をインポートすることで、関数を置き換えることができます。
Python2.6には__future__
インポートがあり、言語構文としてprint
が削除され、代わりに関数形式を使用できるようになります。 例えば:
>>> from __future__ import print_function
>>> print('# of entries', len(dictionary), file=sys.stderr)
新しい関数のシグネチャは次のとおりです。
def print(*args, sep=' ', end='\n', file=None)
パラメータは次のとおりです。
- args :値が出力される位置引数。
- sep :引数の間に出力される区切り文字。
- end :すべての引数が出力された後に出力される終了テキスト。
- file :出力の送信先となるファイルオブジェクト。
PEP 3110:例外処理の変更
Pythonプログラマーがときどき発生するエラーの1つは、次のコードを書くことです。
try:
...
except TypeError, ValueError: # Wrong!
...
作成者はおそらく TypeError と ValueError の両方の例外をキャッチしようとしていますが、このコードは実際には別のことを行います。 TypeError をキャッチし、結果の例外オブジェクトをにバインドします。ローカル名"ValueError"
。 ValueError 例外はまったくキャッチされません。 正しいコードは、例外のタプルを指定します。
try:
...
except (TypeError, ValueError):
...
このエラーは、ここでのコンマの使用があいまいなために発生します。これは、解析ツリー内の2つの異なるノードを示しているのでしょうか、それともタプルである単一のノードを示しているのでしょうか。
Python 3.0は、コンマを「as」という単語に置き換えることで、これを明確にします。 例外をキャッチして例外オブジェクトを変数exc
に格納するには、次のように記述する必要があります。
try:
...
except TypeError as exc:
...
Python 3.0は「as」の使用のみをサポートするため、最初の例は2つの異なる例外をキャッチするものとして解釈されます。 Python 2.6はコンマと「as」の両方をサポートしているため、既存のコードは引き続き機能します。 したがって、2.6でのみ実行される新しいPythonコードを作成するときは、「as」を使用することをお勧めします。
PEP 3112:バイトリテラル
Python 3.0は、言語の基本的な文字列型としてUnicodeを採用し、b'string'
として、または bytes コンストラクターを使用して、8ビットリテラルを異なる方法で示します。 将来の互換性のために、Python2.6は bytes を str タイプの同義語として追加し、b
表記もサポートします。
2.6 str は、3.0の bytes タイプとはさまざまな点で異なります。 最も注目すべきは、コンストラクターが完全に異なることです。 3.0では、bytes([65, 66, 67])
は3要素の長さで、ABC
を表すバイトが含まれています。 2.6では、bytes([65, 66, 67])
は、リストの str()を表す12バイトの文字列を返します。
2.6での bytes の主な用途は、isinstance(x, bytes)
などのオブジェクトタイプのテストを作成することです。 これは、2.xコードが文字列に文字または8ビットバイトのいずれかを含めることを意図しているかどうかを判断できない2to3コンバーターに役立ちます。 bytes または str のいずれかを使用して意図を正確に表すことができるようになり、結果のコードはPython3.0でも正しくなります。
__future__
インポートもあり、すべての文字列リテラルがUnicode文字列になります。 これは、\u
エスケープシーケンスを使用してUnicode文字を含めることができることを意味します。
from __future__ import unicode_literals
s = ('\u751f\u3080\u304e\u3000\u751f\u3054'
'\u3081\u3000\u751f\u305f\u307e\u3054')
print len(s) # 12 Unicode characters
Cレベルでは、Python 3.0は、Python2.xでPyStringObject
と呼ばれる既存の8ビット文字列型の名前を PyBytesObject に変更します。 Python 2.6は、#define
を使用して、 PyBytesObject()、 PyBytes_Check()、 PyBytes_FromStringAndSize()、およびその他すべての関数と文字列で使用されるマクロ。
bytes タイプのインスタンスは、文字列と同じように不変です。 新しい bytearray タイプは、可変のバイトシーケンスを格納します。
>>> bytearray([65, 66, 67])
bytearray(b'ABC')
>>> b = bytearray(u'\u21ef\u3244', 'utf-8')
>>> b
bytearray(b'\xe2\x87\xaf\xe3\x89\x84')
>>> b[0] = '\xe3'
>>> b
bytearray(b'\xe3\x87\xaf\xe3\x89\x84')
>>> unicode(str(b), 'utf-8')
u'\u31ef \u3244'
バイト配列は、startswith()
/ endswith()
、find()
/ rfind()
などの文字列型のほとんどのメソッドと、リストのいくつかのメソッドをサポートします。 append()
、pop()
、およびreverse()
として。
>>> b = bytearray('ABC')
>>> b.append('d')
>>> b.append(ord('e'))
>>> b
bytearray(b'ABCde')
PyByteArray_FromObject()、 PyByteArray_FromStringAndSize()、およびその他のさまざまな関数を備えた、対応するCAPIもあります。
も参照してください
- PEP 3112 -Python3000のバイトリテラル
- JasonOrendorffによって書かれたPEP。 ChristianHeimesによって2.6にバックポートされました。
PEP 3116:新しいI / Oライブラリ
Pythonの組み込みファイルオブジェクトは多くのメソッドをサポートしていますが、ファイルのようなオブジェクトは必ずしもすべてをサポートしているわけではありません。 ファイルを模倣するオブジェクトは通常、read()
およびwrite()
をサポートしますが、たとえば readline()をサポートしない場合があります。 Python 3.0では、 io モジュールにレイヤードI / Oライブラリが導入されており、基本的な読み取りおよび書き込み操作からバッファリングおよびテキスト処理機能が分離されています。
io モジュールによって提供される抽象基本クラスには次の3つのレベルがあります。
RawIOBase
は、生のI / O操作を定義します:read()
、readinto()
、write()
、seek()
、tell()
、[X93X ] 、およびclose()
。 このクラスのほとんどのメソッドは、多くの場合、単一のシステムコールにマップされます。 特定のオブジェクトが許可する操作を決定するためのreadable()
、writable()
、およびseekable()
メソッドもあります。Python 3.0には、ファイルとソケット用のこのクラスの具体的な実装がありますが、Python 2.6は、ファイルとソケットオブジェクトをこのように再構築していません。
BufferedIOBase
は、メモリ内のデータをバッファリングして使用されるシステムコールの数を減らし、I / O処理をより効率的にする抽象基本クラスです。RawIOBase
のすべてのメソッドをサポートし、基になるrawオブジェクトを保持するraw
属性を追加します。このABCを実装する具体的なクラスは5つあります。
BufferedWriter
およびBufferedReader
は、ランダムアクセス用のseek()
メソッドを持つ、書き込み専用または読み取り専用の使用をサポートするオブジェクト用です。BufferedRandom
オブジェクトは、同じ基になるストリームへの読み取りおよび書き込みアクセスをサポートし、BufferedRWPair
は、接続されていないデータストリームに作用する読み取り操作と書き込み操作の両方を持つTTYなどのオブジェクト用です。BytesIO
クラスは、メモリ内バッファの読み取り、書き込み、およびシークをサポートします。TextIOBase
:文字列の読み取りと書き込み(Python 3.0では文字列はUnicodeになることを忘れないでください)、およびユニバーサルニューラインをサポートするための関数を提供します。TextIOBase
は、 readline()メソッドを定義し、オブジェクトの反復をサポートします。2つの具体的な実装があります。
TextIOWrapper
は、バッファリングされたI / Oオブジェクトをラップし、テキストI / Oのすべてのメソッドをサポートし、基になるオブジェクトにアクセスするためのbuffer
属性を追加します。StringIO
は、ディスクに何も書き込まずに、メモリ内のすべてを単にバッファリングします。(Python 2.6では、 io.StringIO は純粋なPythonで実装されているため、かなり低速です。 したがって、今のところ、既存の
StringIO
モジュールまたはcStringIO
を使用する必要があります。 ある時点で、Python3.0の io モジュールは速度を上げるためにCに書き直され、おそらくCの実装は2.xリリースにバックポートされます。)
Python 2.6では、基礎となる実装は、 io モジュールのクラスの上に構築するように再構築されていません。 このモジュールは、3.0と上位互換性のあるコードを簡単に記述できるようにし、開発者がバッファリングとテキストI / Oの独自の実装を作成する手間を省くために提供されています。
も参照してください
- PEP 3116 -新しいI / O
- Daniel Stutzbach、Mike Verdone、Guido vanRossumによって書かれたPEP。 Guido van Rossum、Georg Brandl、Walter Doerwald、Jeremy Hylton、MartinvonLöwis、TonyLowndsなどによるコード。
PEP 3118:改訂されたバッファプロトコル
バッファプロトコルは、Python型が内部表現にポインタを交換できるようにするCレベルのAPIです。 たとえば、メモリマップトファイルは文字のバッファとして表示できます。これにより、 re などの別のモジュールで、メモリマップトファイルを検索対象の文字列として扱うことができます。
バッファプロトコルの主なユーザーは、NumPyなどの数値処理パッケージです。これは、配列の内部表現を公開するため、呼び出し元は、低速のAPIを経由せずに、配列に直接データを書き込むことができます。 このPEPは、NumPy開発の経験に照らしてバッファープロトコルを更新し、配列の形状の表示やメモリ領域のロックなどの多くの新機能を追加します。
最も重要な新しいCAPI関数はPyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
です。これは、オブジェクトとフラグのセットを受け取り、Py_buffer
構造体にオブジェクトのメモリ表現に関する情報を入力します。 オブジェクトはこの操作を使用して、外部の呼び出し元がコンテンツを変更している間、メモリを所定の位置にロックできます。そのため、外部の呼び出し元が完了したことを示す対応するPyBuffer_Release(Py_buffer *view)
があります。
PyObject_GetBuffer()の flags 引数は、返されるメモリに対する制約を指定します。 いくつかの例は次のとおりです。
PyBUF_WRITABLE
は、メモリが書き込み可能でなければならないことを示します。PyBUF_LOCK
は、メモリの読み取り専用または排他的ロックを要求します。PyBUF_C_CONTIGUOUS
およびPyBUF_F_CONTIGUOUS
は、C連続(最後の次元が最も速く変化する)またはFortran連続(最初の次元が最も速く変化する)配列レイアウトを要求します。
PyArg_ParseTuple()、s*
およびz*
の2つの新しい引数コードは、パラメーターのロックされたバッファーオブジェクトを返します。
PEP 3119:抽象基本クラス
Javaなどの一部のオブジェクト指向言語は、クラスが特定のメソッドセットを持っているか、特定のアクセスプロトコルをサポートしていることを宣言するインターフェイスをサポートしています。 抽象基本クラス(またはABC)は、Pythonと同等の機能です。 ABCサポートは、ABCMeta
と呼ばれるメタクラスを含む abc モジュールで構成され、 isinstance()および issubclass()によるこのメタクラスの特別な処理]ビルトイン、およびPython開発者が広く役立つと考える基本的なABCのコレクション。 Pythonの将来のバージョンでは、おそらくさらにABCが追加されるでしょう。
特定のクラスがあり、それが辞書スタイルのアクセスをサポートしているかどうかを知りたいとします。 ただし、「辞書スタイル」というフレーズはあいまいです。 obj[1]
でアイテムにアクセスできることを意味している可能性があります。 obj[2] = value
で項目を設定することは機能するということですか? または、オブジェクトにkeys()
、values()
、およびitems()
メソッドが含まれるということですか? iterkeys()
などの反復バリアントはどうですか? copy()とupdate()
? iter()でオブジェクトを反復処理しますか?
Python 2.6 collections モジュールには、これらの違いを表すさまざまなABCが含まれています。 Iterable
は、クラスが__iter__()
を定義することを示し、Container
は、クラスが__contains__()
メソッドを定義するため、x in y
式をサポートすることを意味します。 アイテムの取得、アイテムの設定、keys()
、values()
、items()
の基本的な辞書インターフェースは、MutableMapping
ABCによって定義されています。
特定のABCから独自のクラスを派生させて、ABCのインターフェイスをサポートしていることを示すことができます。
import collections
class Storage(collections.MutableMapping):
...
または、目的のABCから派生せずにクラスを記述し、代わりにABCのregister()
メソッドを呼び出してクラスを登録することもできます。
import collections
class Storage:
...
collections.MutableMapping.register(Storage)
あなたが書くクラスの場合、ABCから派生する方がおそらくより明確です。 register()
メソッドは、既存の型またはクラスを記述できる新しいABCを作成した場合、または一部のサードパーティクラスがABCを実装することを宣言する場合に役立ちます。 たとえば、PrintableType
ABCを定義した場合、次のことを行うのが合法です。
# Register Python's types
PrintableType.register(int)
PrintableType.register(float)
PrintableType.register(str)
クラスはABCで指定されたセマンティクスに従う必要がありますが、Pythonはこれをチェックできません。 ABCの要件を理解し、それに応じてコードを実装するのは、クラスの作成者次第です。
オブジェクトが特定のインターフェースをサポートしているかどうかを確認するために、次のように書くことができます。
def func(d):
if not isinstance(d, collections.MutableMapping):
raise ValueError("Mapping object expected, not %r" % d)
上記の例のように、今からたくさんの小切手を書き始めなければならないとは思わないでください。 Pythonにはダックタイピングの強い伝統があり、明示的な型チェックは行われず、コードはオブジェクトのメソッドを呼び出すだけで、それらのメソッドが存在することを信頼し、存在しない場合は例外を発生させます。 ABCをチェックする際は慎重に行い、絶対に必要な場合にのみ行ってください。
クラス定義のメタクラスとしてabc.ABCMeta
を使用すると、独自のABCを作成できます。
from abc import ABCMeta, abstractmethod
class Drawable():
__metaclass__ = ABCMeta
@abstractmethod
def draw(self, x, y, scale=1.0):
pass
def draw_doubled(self, x, y):
self.draw(x, y, scale=2.0)
class Square(Drawable):
def draw(self, x, y, scale):
...
上記のDrawable
ABCでは、draw_doubled()
メソッドはオブジェクトをその2倍のサイズでレンダリングし、Drawable
で説明されている他のメソッドで実装できます。 したがって、このABCを実装するクラスは、draw_doubled()
の独自の実装を提供する必要はありませんが、提供することはできます。 ただし、draw()
の実装が必要です。 ABCは、有用な汎用実装を提供できません。
@abstractmethod
デコレータは、実装する必要のあるdraw()
などのメソッドに適用できます。 Pythonは、メソッドを定義しないクラスに対して例外を発生させます。 例外が発生するのは、メソッドがないサブクラスのインスタンスを実際に作成しようとした場合のみであることに注意してください。
>>> class Circle(Drawable):
... pass
...
>>> c = Circle()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Circle with abstract methods draw
>>>
抽象データ属性は、@abstractproperty
デコレータを使用して宣言できます。
from abc import abstractproperty
...
@abstractproperty
def readonly(self):
return self._x
次に、サブクラスはreadonly()
プロパティを定義する必要があります。
も参照してください
- PEP 3119 -抽象基本クラスの紹介
- グイドヴァンロッサムとタリンによって書かれたPEP。 グイドヴァンロッサムによって実装されました。 アレックス・マルテッリとともに、ベンジャミン・アランギュレンによって2.6にバックポートされました。
PEP 3127:整数リテラルのサポートと構文
Python 3.0は、8進数(base-8)整数リテラルの構文を変更し、先行ゼロの代わりに「0o」または「0O」をプレフィックスとして付け、「0b」で示される2進数(base-2)整数リテラルのサポートを追加します。または「0B」プレフィックス。
Python 2.6は、8進数を示す先行0のサポートを削除しませんが、「0o」と「0b」のサポートを追加します。
>>> 0o21, 2*8 + 1
(17, 17)
>>> 0b101111
47
oct()ビルトインは、先行ゼロが前に付いた数値を返し、新しい bin()ビルトインは数値のバイナリ表現を返します。
>>> oct(42)
'052'
>>> future_builtins.oct(42)
'0o52'
>>> bin(173)
'0b10101101'
int()およびlong()
ビルトインは、base-8またはbase-2が要求されたとき、または base のときに、「0o」および「0b」プレフィックスを受け入れるようになりました。 ]引数がゼロです(使用される基数が文字列から決定される必要があることを示します):
>>> int ('0o52', 0)
42
>>> int('1101', 2)
13
>>> int('0b1101', 2)
13
>>> int('0b1101', 0)
13
PEP 3129:クラスデコレータ
デコレータは関数からクラスに拡張されました。 現在、次のように書くことは合法です。
@foo
@bar
class A:
pass
これは次と同等です。
class A:
pass
A = foo(bar(A))
PEP 3141:数値のタイプ階層
Python 3.0は、Schemeの数値タワーに触発された数値型のいくつかの抽象基本クラスを追加します。 これらのクラスは、 numbers モジュールとして2.6にバックポートされました。
最も一般的なABCはNumber
です。 これは操作をまったく定義せず、isinstance(obj, Number)
を実行してオブジェクトが数値であるかどうかを確認できるようにするためにのみ存在します。
Complex
はNumber
のサブクラスです。 複素数は、加算、減算、乗算、除算、およびべき乗の基本的な操作を実行でき、実数部と虚数部を取得して、数の共役を取得できます。 Pythonの組み込み複合型は、Complex
の実装です。
Real
は、Complex
からさらに派生し、実数でのみ機能する演算を追加します:floor()
、trunc()
、丸め、余りをモジュロN、フロア分割、および比較。
Rational
の数値は、Real
から派生し、numerator
およびdenominator
プロパティを持ち、浮動小数点数に変換できます。 Python 2.6は、 fractions モジュールに単純な有理数クラスFraction
を追加します。 ( numbers.Rational との名前の衝突を避けるために、Rational
ではなくFraction
と呼ばれます。)
Integral
の数値はRational
から派生し、[X140X] および>>
と組み合わせて、&
などのビット演算を使用して左右にシフトできます。および|
であり、配列インデックスおよびスライス境界として使用できます。
Python 3.0では、PEPは既存の組み込み round()、 math.floor()、 math.ceil()をわずかに再定義し、新しいものを追加します、 math.trunc()、これはPython2.6にバックポートされています。 math.trunc()はゼロに向かって丸められ、関数の引数とゼロの間にある最も近いIntegral
を返します。
分数モジュール
数値型の階層を埋めるために、 fractions モジュールは有理数クラスを提供します。 有理数は、その値を分数を形成する分子および分母として格納し、浮動小数点数でしか概算できない2/3
などの数を正確に表すことができます。
Fraction
コンストラクターは、結果の分数の分子と分母となる2つのIntegral
値を取ります。
>>> from fractions import Fraction
>>> a = Fraction(2, 3)
>>> b = Fraction(2, 5)
>>> float(a), float(b)
(0.66666666666666663, 0.40000000000000002)
>>> a+b
Fraction(16, 15)
>>> a/b
Fraction(5, 3)
浮動小数点数を有理数に変換するために、float型にas_integer_ratio()
メソッドが追加されました。このメソッドは、同じ浮動小数点値に評価される分数の分子と分母を返します。
>>> (2.5) .as_integer_ratio()
(5, 2)
>>> (3.1415) .as_integer_ratio()
(7074029114692207L, 2251799813685248L)
>>> (1./3) .as_integer_ratio()
(6004799503160661L, 18014398509481984L)
1./3などの浮動小数点数でのみ近似できる値は、近似される数値に単純化されないことに注意してください。 小数部は、浮動小数点値を正確にに一致させようとします。
fractions モジュールは、PythonのDemo/classes/
ディレクトリに長い間存在していたSjoerdMullenderによる実装に基づいています。 この実装は、JeffreyYasskinによって大幅に更新されました。
その他の言語の変更
コアPython言語に加えられたいくつかの小さな変更は次のとおりです。
__main__.py
ファイルを含むディレクトリとzipアーカイブは、それらの名前をインタプリタに渡すことで直接実行できるようになりました。 ディレクトリまたはzipアーカイブは、sys.pathの最初のエントリとして自動的に挿入されます。 (Andy Chuによる提案と最初のパッチ、その後PhillipJによって改訂されました。 EbyとNickCoghlan; :issue: `1739468` 。)hasattr()関数は、
__getattr__()
メソッドが何らかの理由で失敗し、 hasattr()の戻り値が失敗することを意味するという仮定の下で、すべてのエラーをキャッチして無視していました。したがって、False
になります。 ただし、このロジックは KeyboardInterrupt および SystemExit には適用しないでください。 Python 2.6は、 hasattr()が例外を検出したときに、そのような例外を破棄しなくなりました。 (BenjaminPetersonによって修正されました; :issue: `2196` 。)**
構文を使用して関数を呼び出してキーワード引数を指定する場合、Python辞書を使用する必要はなくなりました。 すべてのマッピングが機能するようになりました。>>> def f(**kw): ... print sorted(kw) ... >>> ud=UserDict.UserDict() >>> ud['a'] = 1 >>> ud['b'] = 'string' >>> f(**ud) ['a', 'b']
(AlexanderBelopolskyによる寄稿; :issue: `1686487` 。)
関数呼び出しの
*args
引数の後にキーワード引数を指定することも合法になりました。>>> def f(*args, **kw): ... print args, kw ... >>> f(1,2,3, *(4,5,6), keyword=13) (1, 2, 3, 4, 5, 6) {'keyword': 13}
以前は、これは構文エラーでした。 (Amaury Forgeotd'Arcによる寄稿; :issue: `3473` 。)
新しい組み込みの
next(iterator, [default])
は、指定されたイテレータから次のアイテムを返します。 default 引数が指定されている場合、 iterator が使い果たされていると返されます。 そうしないと、 StopIteration 例外が発生します。 (:issue: `2719` にバックポートされています。)タプルには、リストタイプの
index()
およびcount()
メソッドと一致するindex()
およびcount()
メソッドがあります。>>> t = (0,1,2,3,4,0,1,2) >>> t.index(3) 3 >>> t.count(0) 2
(Raymond Hettingerによる寄稿)
組み込み型では、拡張スライス構文のサポートが改善され、
(start, stop, step)
のさまざまな組み合わせを受け入れるようになりました。 以前は、サポートは部分的であり、特定のコーナーケースは機能しませんでした。 (Thomas Woutersによって実装されました。)プロパティには、
getter
、setter
、deleter
の3つの属性があります。これらは、既存のプロパティにゲッター、セッター、またはデリッター関数を追加するための便利なショートカットを提供するデコレーターです。 あなたはこれらをこのように使うでしょう:class C(object): @property def x(self): return self._x @x.setter def x(self, value): self._x = value @x.deleter def x(self): del self._x class D(C): @C.x.getter def x(self): return self._x * 2 @x.setter def x(self, value): self._x = value / 2
組み込みセットタイプのいくつかのメソッドは、複数の反復可能オブジェクトを受け入れるようになりました:
intersection()
、intersection_update()
、union()
、update()
、difference()
、および[ X131X] 。>>> s=set('1234567890') >>> s.intersection('abc123', 'cdf246') # Intersection between all inputs set(['2']) >>> s.difference('246', '789') set(['1', '0', '3', '5'])
(Raymond Hettingerによる寄稿。)
多くの浮動小数点機能が追加されました。 float()関数は、文字列
nan
をIEEE754 Not A Number値に変換し、+inf
および-inf
を正または負の無限大に変換します。 。 これは、IEEE754セマンティクスを備えたすべてのプラットフォームで機能します。 (ChristianHeimesによる寄稿; :issue: `1635` 。)math モジュールの他の関数
isinf()
およびisnan()
は、浮動小数点引数が無限大または数値でない場合にtrueを返します。 (:issue: `1640` )浮動小数点数を16進文字列に変換するための変換関数が追加されました(:issue: `3008` )。 これらの関数は、10進数と2進数の間の変換による丸め誤差を発生させることなく、浮動小数点数を文字列表現との間で変換します。 フロートには、文字列表現を返す hex()メソッドがあり、
float.fromhex()
メソッドは文字列を数値に変換し直します。>>> a = 3.75 >>> a.hex() '0x1.e000000000000p+1' >>> float.fromhex('0x1.e000000000000p+1') 3.75 >>> b=1./3 >>> b.hex() '0x1.5555555555555p-2'
数値の良さ:符号付きゼロ(-0および+0)をサポートするシステムで2つの浮動小数点数から複素数を作成する場合、 complex()コンストラクターはゼロの符号を保持するようになりました。 (MarkTによって修正されました。 ディキンソン; :issue: `1507` 。)
親クラスから
__hash__()
メソッドを継承するクラスは、__hash__ = None
を設定して、クラスがハッシュ可能でないことを示すことができます。 これにより、hash(obj)
は TypeError を発生させ、クラスはHashable
ABCを実装しているとは示されません。これは、オブジェクトをIDではなく値で比較する
__cmp__()
または__eq__()
メソッドを定義したときに行う必要があります。 すべてのオブジェクトには、ハッシュ値としてid(obj)
を使用するデフォルトのハッシュメソッドがあります。 親クラスから継承された__hash__()
メソッドを削除するための整然とした方法がないため、None
の割り当てがオーバーライドとして実装されました。 経営幹部レベルでは、拡張機能はtp_hash
を PyObject_HashNotImplemented()に設定できます。 (NickCoghlanとAmauryForgeotd'Arcによって修正されました; :issue: `2235` 。)GeneratorExit 例外は、 Exception ではなく BaseException をサブクラス化するようになりました。 これは、
except Exception:
を実行する例外ハンドラーが誤って GeneratorExit をキャッチしないことを意味します。 (ChadAustinによる寄稿; :issue: `1537` 。)ジェネレーターオブジェクトには、ジェネレーターをサポートする元のコードオブジェクトを参照する
gi_code
属性が含まれるようになりました。 (CollinWinterによる寄稿; :issue: `1473257` 。)compile()組み込み関数は、位置パラメーターだけでなくキーワード引数も受け入れるようになりました。 (ThomasWoutersによる寄稿; :issue: `1444529` 。)
complex()コンストラクターは、括弧で囲まれた複素数を含む文字列を受け入れるようになりました。つまり、
complex(repr(cplx))
は値をラウンドトリップします。 たとえば、complex('(3+4j)')
は値(3 + 4j)を返すようになりました。 (:issue: `1491866` )文字列
translate()
メソッドは、変換テーブルパラメータとしてNone
を受け入れるようになりました。これは、ID変換として扱われます。 これにより、文字のみを削除する操作が簡単になります。 (Bengt Richterによって寄稿され、RaymondHettingerによって実装されました; :issue: `1193128` 。)組み込みの dir()関数は、受信したオブジェクトの
__dir__()
メソッドをチェックするようになりました。 このメソッドは、オブジェクトの有効な属性の名前を含む文字列のリストを返す必要があり、 dir()が生成する値をオブジェクトが制御できるようにします。__getattr__()
または__getattribute__()
メソッドを持つオブジェクトは、これを使用して、尊重する疑似属性をアドバタイズできます。 (:issue: `1591665` )インスタンスメソッドオブジェクトには、メソッドを構成するオブジェクトと関数の新しい属性があります。
im_self
の新しい同義語は__self__
であり、im_func
は__func__
としても利用できます。 古い名前はPython2.6でも引き続きサポートされていますが、3.0ではなくなりました。あいまいな変更: class ステートメント内で locals()関数を使用すると、結果のディクショナリは自由変数を返さなくなります。 (この場合、自由変数は、クラスの属性ではない
class
ステートメントで参照される変数です。)
最適化
警告モジュールはCで書き直されました。 これにより、パーサーから警告を呼び出すことが可能になり、インタープリターの起動が速くなる可能性もあります。 (NealNorwitzとBrettCannonによる寄稿; :issue: `1631171` 。)
型オブジェクトにメソッドのキャッシュが追加され、特定のクラスの正しいメソッド実装を見つけるために必要な作業を減らすことができます。 キャッシュされると、インタプリタは、呼び出す適切なメソッドを見つけるために基本クラスをトラバースする必要はありません。 基本クラスまたはクラス自体が変更されるとキャッシュがクリアされるため、Pythonの動的な性質に直面しても、キャッシュは正しいままである必要があります。 (Armin Rigoによって実装された元の最適化、KevinJacobsによってPython2.6用に更新されました; :issue: `1700288` 。)
デフォルトでは、この変更はPythonコアに含まれているタイプにのみ適用されます。 拡張モジュールは必ずしもこのキャッシュと互換性があるとは限らないため、メソッドキャッシュを有効にするには、モジュールの
tp_flags
フィールドにPy_TPFLAGS_HAVE_VERSION_TAG
を明示的に追加する必要があります。 (メソッドキャッシュとの互換性を保つために、拡張モジュールのコードは、実装するタイプのtp_dict
メンバーに直接アクセスして変更してはなりません。 ほとんどのモジュールはこれを行いませんが、Pythonインタープリターがそれを判断することは不可能です。 いくつかの議論については、:issue: `1878` を参照してください。)キーワード引数を使用する関数呼び出しは、ポインタをすばやく比較することで大幅に高速化され、通常、文字列全体の比較の時間を節約できます。 (Antoine Pitrouによる最初の実装後、RaymondHettingerによって寄稿されました; :issue: `1819` 。)
struct モジュールのすべての関数は、Need For Speedスプリントでの作業のおかげで、Cで書き直されました。 (Raymond Hettingerによる寄稿。)
一部の標準の組み込み型は、型オブジェクトにビットを設定するようになりました。 これにより、オブジェクトがこれらのタイプのいずれかのサブクラスであるかどうかのチェックが高速化されます。 (Neal Norwitzによる寄稿。)
Unicode文字列は、空白や改行を検出するためにより高速なコードを使用するようになりました。 これにより、
split()
メソッドが約25%、splitlines()
が35%高速化されます。 (Antoine Pitrouによる寄稿。)Unicode文字列のデータにpymallocを使用することにより、メモリ使用量が削減されます。with
ステートメントは、__exit__()
メソッドをスタックに格納するようになり、わずかなスピードアップを実現します。 (Jeffrey Yasskinによって実装されました。)メモリ使用量を削減するために、ガベージコレクターは、最上位世代のオブジェクトをガベージコレクションするときに内部の空きリストをクリアするようになりました。 これにより、メモリがオペレーティングシステムに早く戻る可能性があります。
通訳の変更
2つのコマンドラインオプションは、他のPython実装で使用するために予約されています。 -J スイッチは、基盤となるJVMに渡されるスイッチなど、Jython固有のオプション用にJythonが使用するために予約されています。 -X は、CPython、Jython、IronPythonなどのPythonの特定の実装に固有のオプション用に予約されています。 いずれかのオプションがPython2.6で使用されている場合、インタープリターはそのオプションが現在使用されていないことを報告します。
-B スイッチをPythonインタープリターに提供するか、 を設定することにより、Pythonが.pyc
または.pyo
ファイルを書き込まないようにすることができます。 ] PYTHONDONTWRITEBYTECODE インタープリターを実行する前の環境変数。 この設定は、Pythonプログラムでsys.dont_write_bytecode
変数として使用でき、Pythonコードは値を変更して、インタープリターの動作を変更できます。 (NealNorwitzとGeorgBrandlによる寄稿)
標準入力、出力、および標準エラーに使用されるエンコードは、インタープリターを実行する前に PYTHONIOENCODING 環境変数を設定することで指定できます。 値は、<encoding>
または<encoding>:<errorhandler>
の形式の文字列である必要があります。 encoding 部分は、エンコーディングの名前を指定します。例: utf-8
またはlatin-1
; オプションの errorhandler 部分は、エンコーディングで処理できない文字をどう処理するかを指定します。これは、「エラー」、「無視」、または「置換」のいずれかである必要があります。 (MartinvonLöwisによる寄稿。)
新規および改善されたモジュール
すべてのリリースと同様に、Pythonの標準ライブラリには多くの機能拡張とバグ修正が含まれています。 これは、モジュール名のアルファベット順にソートされた、最も注目すべき変更の部分的なリストです。 変更のより完全なリストについては、ソースツリーのMisc/NEWS
ファイルを参照するか、すべての詳細についてSubversionログを調べてください。
asyncore および asynchat モジュールは再びアクティブに保守されており、いくつかのパッチとバグ修正が適用されています。 (Josiah Carlsonによって保守されています。1つのパッチについては:issue: `1736190` を参照してください。)
bsddb
モジュールには、新しいメンテナであるJesúsCeaAviónも含まれており、パッケージはスタンドアロンパッケージとして利用できるようになりました。 パッケージのWebページは www.jcea.es/programacion/pybsddb.htm です。 リリースのペースはPythonよりもはるかに頻繁であるため、Python3.0の標準ライブラリからパッケージを削除する予定です。bsddb.dbshelve
モジュールは、プロトコル1に制限するのではなく、利用可能な最高のピクルスプロトコルを使用するようになりました。 (Wによる寄稿。 バーンズ。)cgi モジュールは、HTTPPOSTリクエストのクエリ文字列から変数を読み取るようになりました。 これにより、「/ cgi-bin / add.py?category = 1」などのクエリ文字列を含むURLでフォームアクションを使用できるようになります。 (AlexandreFioriとNubisによる寄稿; :issue: `1817` 。)
parse_qs()
およびparse_qsl()
関数は、 cgi モジュールからurlparse
モジュールに再配置されました。 cgi モジュールでまだ利用可能なバージョンは、2.6で PendingDeprecationWarning メッセージをトリガーします(:issue: `600362` )。cmath モジュールは、MarkDickinsonとChristianHeimesによって寄稿され、大幅に改訂されました。 5つの新しい機能が追加されました。
polar()
は、複素数を極形式に変換し、複素数のモジュラスと引数を返します。rect()
は逆のことを行い、モジュラスと引数のペアを対応する複素数に戻します。phase()
は、複素数の引数(角度とも呼ばれます)を返します。isnan()
は、引数の実数部または虚数部がNaNの場合、Trueを返します。isinf()
は、引数の実数部または虚数部が無限大の場合にTrueを返します。
改訂により、 cmath モジュールの数値の健全性も改善されました。 すべての関数について、結果の実数部と虚数部は、可能な限り、最小精度(ulps)の数単位以内で正確です。 詳細については、:issue: `1381` を参照してください。
asinh()
、atanh()
:およびatan()
のブランチカットも修正されました。モジュールのテストは大幅に拡張されました。 2000近くの新しいテストケースが代数関数を実行します。
IEEE 754プラットフォームでは、 cmath モジュールが、C99標準の付録「G」と一致する方法でIEEE754特殊値と浮動小数点例外を処理するようになりました。
collections モジュールの新しいデータ型:
namedtuple(typename, fieldnames)
は、フィールドに名前とインデックスでアクセスできる標準タプルのサブクラスを作成するファクトリ関数です。 例えば:>>> var_type = collections.namedtuple('variable', ... 'id name type size') >>> # Names are separated by spaces or commas. >>> # 'id, name, type, size' would also work. >>> var_type._fields ('id', 'name', 'type', 'size') >>> var = var_type(1, 'frequency', 'int', 4) >>> print var[0], var.id # Equivalent 1 1 >>> print var[2], var.type # Equivalent int int >>> var._asdict() {'size': 4, 'type': 'int', 'id': 1, 'name': 'frequency'} >>> v2 = var._replace(name='amplitude') >>> v2 variable(id=1, name='amplitude', type='int', size=4)
タプルを返す標準ライブラリのいくつかの場所が、
namedtuple
インスタンスを返すように変更されました。 たとえば、Decimal.as_tuple()
メソッドは、sign
、digits
、およびexponent
フィールドを持つ名前付きタプルを返すようになりました。(Raymond Hettingerによる寄稿。)
collections モジュールのもう1つの変更点は、
deque
タイプがオプションの maxlen パラメーターをサポートするようになったことです。 指定した場合、両端キューのサイズは maxlen アイテム以下に制限されます。 フルデックにアイテムを追加すると、古いアイテムは破棄されます。>>> from collections import deque >>> dq=deque(maxlen=3) >>> dq deque([], maxlen=3) >>> dq.append(1); dq.append(2); dq.append(3) >>> dq deque([1, 2, 3], maxlen=3) >>> dq.append(4) >>> dq deque([2, 3, 4], maxlen=3)
(Raymond Hettingerによる寄稿。)
Cookie
モジュールのMorsel
オブジェクトは、httponly
属性をサポートするようになりました。 一部のブラウザでは。 この属性が設定されたCookieは、JavaScriptコードでアクセスまたは操作することはできません。 (ArvinSchnellによる寄稿; :issue: `1638033` 。)curses モジュールの新しいウィンドウメソッド
chgat()
は、1行の特定の文字数の表示属性を変更します。 (Fabian Kreutzによる寄稿)# Boldface text starting at y=0,x=21 # and affecting the rest of the line. stdscr.chgat(0, 21, curses.A_BOLD)
curses.textpad モジュールの
Textbox
クラスは、挿入モードと上書きモードでの編集をサポートするようになりました。 挿入モードは、Textbox
インスタンスの作成時に insert_mode パラメーターにtrue値を指定することで有効になります。datetime モジュールの
strftime()
メソッドは、オブジェクトのマイクロ秒数に拡張される%f
形式のコードをサポートするようになり、左側から6桁までゼロが埋め込まれます。 (SkipMontanaroによる寄稿; :issue: `1158` 。)10進数モジュールは、一般10進数仕様のバージョン1.66に更新されました。 新機能には、
exp()
やlog10()
などのいくつかの基本的な数学関数のメソッドが含まれています。>>> Decimal(1).exp() Decimal("2.718281828459045235360287471") >>> Decimal("2.7182818").ln() Decimal("0.9999999895305022877376682436") >>> Decimal(1000).log10() Decimal("3")
Decimal
オブジェクトのas_tuple()
メソッドは、sign
、digits
、およびexponent
フィールドを持つ名前付きタプルを返すようになりました。(ファクンドバティスタとマークディキンソンによって実装されました。 Raymond Hettingerによって追加された名前付きタプルサポート。)
difflib モジュールの
SequenceMatcher
クラスは、a
、b
、およびsize
属性を持つ、一致を表す名前付きタプルを返すようになりました。 (Raymond Hettingerによる寄稿。)オプションの
timeout
パラメーターは、秒単位で測定されるタイムアウトを指定し、 ftplib.FTP クラスコンストラクターとconnect()
メソッドに追加されました。 (Facundo Batistaによって追加されました。)また、FTP
クラスのstorbinary()
およびstorlines()
は、の各ブロックで呼び出されるオプションの callback パラメーターを受け取るようになりました。データが送信された後のデータ。 (PhilSchwartzによる寄稿; :issue: `1221598` 。)reduce()
組み込み関数は、 functools モジュールでも使用できます。 Python 3.0では、組み込みが削除され、reduce()
は functools からのみ使用できます。 現在、2.xシリーズのビルトインを削除する予定はありません。 (ChristianHeimesによるパッチ; :issue: `1739906` 。)可能な場合、 getpass モジュールは
/dev/tty
を使用してプロンプトメッセージを出力し、パスワードを読み取り、標準エラーと標準入力にフォールバックします。 パスワードが端末にエコーされる可能性がある場合は、プロンプトが表示される前に警告が出力されます。 (GregoryPによる寄稿。 スミス。)glob.glob()関数は、Unicodeパスが使用され、Unicodeファイル名がディレクトリ内で一致した場合に、Unicodeファイル名を返すことができるようになりました。 (:issue: `1001604` )
heapq モジュールの新しい関数
merge(iter1, iter2, ...)
は、データをソートされた順序で返す任意の数のイテレータを受け取り、すべてのイテレータの内容をソートされた順序で返す新しいジェネレータを返します。 。 例えば:>>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16])) [1, 2, 3, 5, 8, 9, 16]
もう1つの新しい関数
heappushpop(heap, item)
は、 item を heap にプッシュしてから、ポップオフして最小のアイテムを返します。 これは、heappush()
を呼び出してからheappop()
を呼び出すよりも効率的です。heapq は、以前使用していた以下の比較ではなく、以下の比較のみを使用するように実装されました。 これにより、 heapq の型の使用法は、 list.sort()メソッドと一致します。 (Raymond Hettingerによる寄稿。)
オプションの
timeout
パラメーターは、秒単位で測定されるタイムアウトを指定し、httplib.HTTPConnection
およびHTTPSConnection
クラスコンストラクターに追加されました。 (ファクンドバティスタによって追加されました。)getmoduleinfo()
やgetargs()
など、 inspect モジュールのほとんどの関数は、名前付きタプルを返すようになりました。 タプルのように動作することに加えて、戻り値の要素に属性としてアクセスすることもできます。 (Raymond Hettingerによる寄稿。)モジュールの新機能には、
isgenerator()
、isgeneratorfunction()
、isabstract()
などがあります。itertools モジュールはいくつかの新しい機能を獲得しました。
izip_longest(iter1, iter2, ...[, fillvalue])
は、各要素からタプルを作成します。 一部の反復可能オブジェクトが他の反復可能オブジェクトよりも短い場合、欠落している値は fillvalue に設定されます。 例えば:>>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5])) ((1, 1), (2, 2), (3, 3), (None, 4), (None, 5))
product(iter1, iter2, ..., [repeat=N])
は、提供された反復可能変数のデカルト積を返します。これは、各反復可能変数から返される要素のすべての可能な組み合わせを含むタプルのセットです。>>> list(itertools.product([1,2,3], [4,5,6])) [(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
オプションの repeat キーワード引数は、 N 回繰り返される、反復可能または反復可能のセットの積を取得するために使用されます。 単一の反復可能な引数で、 N -タプルが返されます。
>>> list(itertools.product([1,2], repeat=3)) [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]
2つの反復可能オブジェクトを使用すると、 2N -タプルが返されます。
>>> list(itertools.product([1,2], [3,4], repeat=2)) [(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4), (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4), (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4), (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]
combinations(iterable, r)
は、 iterable の要素から長さ r のサブシーケンスを返します。>>> list(itertools.combinations('123', 2)) [('1', '2'), ('1', '3'), ('2', '3')] >>> list(itertools.combinations('123', 3)) [('1', '2', '3')] >>> list(itertools.combinations('1234', 3)) [('1', '2', '3'), ('1', '2', '4'), ('1', '3', '4'), ('2', '3', '4')]
permutations(iter[, r])
は、反復可能要素の長さ r のすべての順列を返します。 r が指定されていない場合、デフォルトでiterableによって生成される要素の数になります。>>> list(itertools.permutations([1,2,3,4], 2)) [(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]
itertools.chain(*iterables)
は、Python2.6で新しいコンストラクターを取得した itertools の既存の関数です。itertools.chain.from_iterable(iterable)
は、他の反復可能オブジェクトを返す必要がある単一の反復可能オブジェクトを取ります。chain()
は、最初の反復可能要素のすべての要素を返し、次に2番目の要素のすべてを返します。>>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]])) [1, 2, 3, 4, 5, 6]
(すべてRaymond Hettingerによる寄稿です。)
logging モジュールの
FileHandler
クラスとそのサブクラスWatchedFileHandler
、RotatingFileHandler
、およびTimedRotatingFileHandler
に、オプションの delay が追加されました。 ]コンストラクターへのパラメーター。 delay がtrueの場合、ログファイルのオープンは、最初のemit()
呼び出しが行われるまで延期されます。 (Vinay Sajipによる寄稿)TimedRotatingFileHandler
には、 utc コンストラクターパラメーターもあります。 引数がtrueの場合、UTC時間は、真夜中がいつ発生するかを決定し、ファイル名を生成する際に使用されます。 それ以外の場合は現地時間が使用されます。math モジュールにいくつかの新しい関数が追加されました。
isinf()および isnan()は、指定された浮動小数点数がそれぞれ(正または負の)無限大であるかNaN(数値ではない)であるかを判別します。
copysign()は、IEEE 754番号の符号ビットをコピーし、 x の絶対値と y の符号ビットを組み合わせて返します。 たとえば、
math.copysign(1, -0.0)
は-1.0を返します。 (Christian Heimesによる寄稿。)factorial()は、数値の階乗を計算します。 (RaymondHettingerによる寄稿; :issue: `2138` 。)
fsum()は、反復可能からの数値のストリームを合計し、部分的な合計を使用して精度が失われないように注意します。 (Jean Brouwers、Raymond Hettinger、およびMarkDickinsonによる寄稿; :issue: `2819` 。)
log1p()は、 1 + x (ベース e )の自然対数を返します。
trunc()
は数値をゼロに丸め、関数の引数とゼロの間にある最も近いIntegral
を返します。 PEP3141の数値のタイプ階層のバックポートの一部として追加されました。
math モジュールが改善され、特に浮動小数点例外とIEEE 754特殊値の処理に関して、プラットフォーム間でより一貫した動作が提供されるようになりました。
可能な限り、モジュールは754の特別な値に関するC99標準の推奨事項に従います。 たとえば、
sqrt(-1.)
はほぼすべてのプラットフォームで ValueError を返すはずですが、sqrt(float('NaN'))
はすべてのIEEE754プラットフォームでNaNを返すはずです。 C99標準の付録「F」が「ゼロ除算」または「無効」のシグナリングを推奨している場合、Pythonは ValueError を発生させます。 C99標準の付録「F」が「オーバーフロー」のシグナリングを推奨している場合、Pythonは OverflowError を発生させます。 (:issue: `711019` および:issue:` 1640` を参照してください。)(ChristianHeimesとMarkDickinsonによる寄稿。)
mmap オブジェクトに、文字列の末尾から始まり逆方向に検索するサブストリングを検索する
rfind()
メソッドが追加されました。find()
メソッドは、検索を停止するインデックスを与える end パラメーターも取得しました。 (John Lentonによる寄稿。)operator モジュールは、名前とオプションの引数セットを受け取る
methodcaller()
関数を取得し、渡された引数で名前付き関数を呼び出す呼び出し可能オブジェクトを返します。 例えば:>>> # Equivalent to lambda s: s.replace('old', 'new') >>> replacer = operator.methodcaller('replace', 'old', 'new') >>> replacer('old wine in old bottles') 'new wine in new bottles'
(Gregory Petrosyanの提案の後、Georg Brandlによって寄稿されました。)
attrgetter()
関数は、ドット付きの名前を受け入れ、対応する属性ルックアップを実行するようになりました。>>> inst_name = operator.attrgetter( ... '__class__.__name__') >>> inst_name('') 'str' >>> inst_name(help) '_Helper'
(Barry Warsawによる提案の後、Georg Brandlによって寄稿されました。)
os モジュールは、いくつかの新しいシステムコールをラップするようになりました。
fchmod(fd, mode)
とfchown(fd, uid, gid)
は開いているファイルのモードと所有権を変更し、lchmod(path, mode)
はシンボリックリンクのモードを変更します。 (GeorgBrandlとChristianHeimesによる寄稿。)chflags()
およびlchflags()
は、対応するシステムコール(使用可能な場合)のラッパーであり、ファイルに設定されているフラグを変更します。 フラグ値の定数は、 stat モジュールで定義されています。 可能な値には、ファイルを変更できないことを示すUF_IMMUTABLE
や、データをファイルにのみ追加できることを示すUF_APPEND
などがあります。 (Mによる寄稿。 レビンソン。)os.closerange(low, high)
は、 low から high までのすべてのファイル記述子を効率的に閉じ、エラーを無視し、 high 自体を含めません。 この関数は、サブプロセスモジュールで使用され、プロセスの開始を高速化します。 (GeorgBrandlによる寄稿; :issue: `1663329` 。)os.environ
オブジェクトのclear()
メソッドは、オブジェクトのキーをクリアすることに加えて、 os.unsetenv()を使用して環境変数の設定を解除するようになりました。 (MartinHorcickaによる寄稿; :issue: `1181` 。)os.walk()関数に
followlinks
パラメーターが追加されました。 Trueに設定すると、ディレクトリを指すシンボリックリンクをたどり、ディレクトリの内容にアクセスします。 下位互換性のために、パラメーターのデフォルト値はfalseです。 親ディレクトリを指すシンボリックリンクがある場合、関数は無限再帰に分類される可能性があることに注意してください。 (:issue: `1273829` )os.path モジュールで、
splitext()
関数が先頭のピリオド文字で分割されないように変更されました。 これにより、Unixのドットファイルを操作するときに、より良い結果が得られます。 たとえば、os.path.splitext('.ipython')
は(, '.ipython')
ではなく('.ipython',
)
を返すようになりました。 (:issue: `1115886` )新しい関数
os.path.relpath(path, start='.')
は、start
パスが指定されている場合はそれから、または現在の作業ディレクトリから宛先path
への相対パスを返します。 (RichardBarranによる寄稿; :issue: `1339796` 。)Windowsでは、 os.path.expandvars()は、「%var%」の形式で指定された環境変数を展開し、「〜user」はユーザーのホームディレクトリパスに展開されます。 (JosiahCarlsonによる寄稿; :issue: `957650` 。)
pdb モジュールによって提供されるPythonデバッガーは、新しいコマンドを取得しました。「run」は、デバッグ中のPythonプログラムを再起動し、オプションでプログラムの新しいコマンドライン引数を取ることができます。 (RockyBernsteinによる寄稿; :issue: `1393667` 。)
トレースバックのデバッグを開始するために使用される pdb.post_mortem()関数は、トレースバックが指定されていない場合、 sys.exc_info()によって返されるトレースバックを使用するようになりました。 (FacundoBatistaによる寄稿; :issue: `1106316` 。)
pickletools モジュールに
optimize()
関数が追加されました。この関数は、pickleを含む文字列を受け取り、未使用のオペコードをいくつか削除して、同じデータ構造を含む短いpickleを返します。 (Raymond Hettingerによる寄稿。)get_data()
関数が pkgutil モジュールに追加され、インストールされたPythonパッケージに含まれるリソースファイルの内容を返します。 例えば:>>> import pkgutil >>> print pkgutil.get_data('test', 'exception_hierarchy.txt') BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StandardError ...
(PaulMooreによる寄稿; :issue: `2439` 。)
pyexpat
モジュールのParser
オブジェクトで、buffer_size
属性を設定して、文字データを保持するために使用されるバッファーのサイズを変更できるようになりました。 (AchimGaedkeによる寄稿; :issue: `1137` 。)Queue
モジュールは、異なる順序でエントリを取得するキューバリアントを提供するようになりました。PriorityQueue
クラスは、キューに入れられたアイテムをヒープに格納し、優先順に取得します。LifoQueue
は、最後に追加されたエントリを最初に取得します。つまり、スタックのように動作します。 (Raymond Hettingerによる寄稿。)random モジュールの
Random
オブジェクトは、32ビットシステムでピクルス化でき、64ビットシステムでピクルス解除できます。その逆も可能です。 残念ながら、この変更は、Python2.6のRandom
オブジェクトが以前のバージョンのPythonでは正しく選択解除できないことも意味します。 (ShawnLigockiによる寄稿; :issue: `1727780` 。)新しい
triangular(low, high, mode)
関数は、三角分布に従って乱数を返します。 戻り値は low と high の間にあり、 high 自体は含まれず、 mode が分布で最も頻繁に発生する値です。 。 (Wladmir van derLaanとRaymondHettingerによる寄稿; :issue: `1681432` 。)re モジュールによって実行される長い正規表現検索は、配信されているシグナルをチェックするため、時間のかかる検索を中断できるようになりました。 (JoshHoytとRalfSchmittによる寄稿; :issue: `846388` 。)
正規表現モジュールは、小さな正規表現固有の仮想マシンのバイトコードをコンパイルすることによって実装されます。 信頼できないコードは、バイトコードの悪意のある文字列を直接作成してクラッシュを引き起こす可能性があるため、Python2.6には正規表現バイトコードのベリファイアが含まれています。 (Google AppEngineの仕事からGuidovanRossumによって寄稿されました; :issue: `3487` 。)
rlcompleter モジュールの
Completer.complete()
メソッドは、名前の評価中にトリガーされた例外を無視するようになりました。 (LorenzQuackによって修正されました; :issue: `2250` 。)sched モジュールの
scheduler
インスタンスには、読み取り専用の queue 属性があり、フィールド[ X200X] 。 (RaymondHettingerによる寄稿; :issue: `1861` 。)select モジュールに、Linux
epoll()
およびBSDkqueue()
システムコールのラッパー関数が追加されました。modify()
メソッドが既存のpoll
オブジェクトに追加されました。pollobj.modify(fd, eventmask)
は、ファイル記述子またはファイルオブジェクトとイベントマスクを受け取り、そのファイルの記録されたイベントマスクを変更します。 (ChristianHeimesによる寄稿; :issue: `1657` 。)shutil.copytree()関数に、呼び出し可能なオブジェクトを受け取るオプションの ignore 引数が追加されました。 このcallableは、各ディレクトリパスとディレクトリの内容のリストを受け取り、コピーされずに無視される名前のリストを返します。
shutil モジュールは、この新しいパラメーターで使用する
ignore_patterns()
関数も提供します。ignore_patterns()
は、任意の数のglobスタイルのパターンを受け取り、これらのパターンのいずれかに一致するファイルとディレクトリを無視する呼び出し可能オブジェクトを返します。 次の例では、ディレクトリツリーをコピーしますが、名前が「〜」で終わる.svn
ディレクトリとEmacsバックアップファイルの両方をスキップします。shutil.copytree('Doc/library', '/tmp/library', ignore=shutil.ignore_patterns('*~', '.svn'))
(TarekZiadéによる寄稿; :issue: `2663` 。)
シグナル処理をTkinterやGTk +で使用されるようなGUI処理イベントループと統合することは長い間問題でした。 ほとんどのソフトウェアはポーリングを終了し、GUIイベントが発生したかどうかを確認するために、ほんの一瞬ごとにウェイクアップします。 signal モジュールは、これをより効率的にすることができます。
signal.set_wakeup_fd(fd)
を呼び出すと、使用するファイル記述子が設定されます。 信号を受信すると、そのファイル記述子にバイトが書き込まれます。 記述子を設定するためのCレベルの関数 PySignal_SetWakeupFd()もあります。イベントループは、パイプを開いて2つの記述子を作成することでこれを使用します。1つは読み取り用、もう1つは書き込み用です。 書き込み可能な記述子は
set_wakeup_fd()
に渡され、読み取り可能な記述子はselect()
またはpoll()
を介してイベントループによって監視される記述子のリストに追加されます。 信号を受信すると、バイトが書き込まれ、メインイベントループがウェイクアップされるため、ポーリングの必要がなくなります。(AdamOlsenによる寄稿; :issue: `1583` 。)
siginterrupt()
関数がPythonコードから利用できるようになり、シグナルがシステムコールを中断できるかどうかを変更できるようになりました。 (ラルフ・シュミットによる寄稿)setitimer()
およびgetitimer()
機能も追加されました(利用可能な場合)。setitimer()
では、指定時間後に信号をプロセスに配信するインターバルタイマーを設定できます。これは、実時間、消費プロセス時間、またはプロセスとシステムの合計時間で測定されます。 (GuilhermePoloによる寄稿; :issue: `2240` 。)smtplib モジュールは、
SMTP_SSL
クラスの追加により、SMTP overSSLをサポートするようになりました。 このクラスは、既存のSMTP
クラスと同じインターフェースをサポートします。 (Monty Taylorによる寄稿。)両方のクラスコンストラクターには、オプションのtimeout
パラメーターもあります。これは、最初の接続試行のタイムアウトを秒単位で指定します。 (ファクンド・バティスタによる寄稿。)LMTPプロトコルの実装( RFC 2033 )もモジュールに追加されました。 メールキューを管理しないエージェント間で電子メールを転送する場合、SMTPの代わりにLMTPが使用されます。 (LeifHedstromによって実装されたLMTP; :issue: `957003` 。)
SMTP.starttls()
は RFC 3207 に準拠し、TLSネゴシエーション自体から取得されていないサーバーから取得された知識をすべて忘れます。 (BillFennerによるパッチ; :issue: `829951` 。)socket モジュールは、クラスター環境で使用するために設計された高性能の非IPベースのプロトコルであるTIPC( http://tipc.sourceforge.net/ )をサポートするようになりました。 TIPCアドレスは4タプルまたは5タプルです。 (AlbertoBertogliによる寄稿; :issue: `1646` 。)
新しい関数
create_connection()
は、アドレスを取得し、オプションのタイムアウト値を使用してアドレスに接続し、接続されたソケットオブジェクトを返します。 この関数は、アドレスのタイプも検索し、必要に応じてIPv4またはIPv6を使用してアドレスに接続します。socket(socket.AF_INET, ...)
の代わりにcreate_connection()
を使用するようにコードを変更するだけで、コードをIPv6で機能させることができます。SocketServer
モジュールの基本クラスは、サーバーのtimeout
属性で指定された非アクティブ期間の後にhandle_timeout()
メソッドを呼び出すことをサポートするようになりました。 (Michael Pomraningによる寄稿。)serve_forever()
メソッドは、秒単位で測定されるオプションのポーリング間隔を取り、サーバーがシャットダウン要求をチェックする頻度を制御するようになりました。 (PedroWerneckとJeffreyYasskinによる寄稿; :issue: `742598` 、:issue:` 1193577` 。)GerhardHäringによって維持されている sqlite3 モジュールは、Python2.5のバージョン2.3.2からバージョン2.4.1に更新されました。
struct モジュールは、フォーマット文字
'?'
を使用して、C99 _Bool タイプをサポートするようになりました。 (David Remahlによる寄稿。)サブプロセスモジュールによって提供される
Popen
オブジェクトには、terminate()
、kill()
、およびsend_signal()
メソッドが含まれるようになりました。 Windowsでは、send_signal()
はSIGTERM
シグナルのみをサポートし、これらのメソッドはすべてWin32API関数TerminateProcess()
のエイリアスです。 (Christian Heimesによる寄稿。)sys モジュールの新しい変数
float_info
は、プラットフォームの浮動小数点サポートに関するfloat.h
ファイルから派生した情報を含むオブジェクトです。 このオブジェクトの属性には、mant_dig
(仮数の桁数)、epsilon
(1.0と表現可能な次に大きい値の最小差)などがあります。 (ChristianHeimesによる寄稿; :issue: `1534` 。)もう1つの新しい変数
dont_write_bytecode
は、Pythonがモジュールのインポート時に.pyc
または.pyo
ファイルを書き込むかどうかを制御します。 この変数がtrueの場合、コンパイルされたファイルは書き込まれません。 この変数は、起動時にPythonインタープリターに -B スイッチを指定するか、インタープリターを実行する前に PYTHONDONTWRITEBYTECODE 環境変数を設定することによって最初に設定されます。 その後、Pythonコードはこの変数の値を変更して、バイトコードファイルを書き込むかどうかを制御できます。 (NealNorwitzとGeorgBrandlによる寄稿)Pythonインタープリターに提供されるコマンドライン引数に関する情報は、
sys.flags
として利用可能な名前付きタプルの属性を読み取ることで利用できます。 たとえば、Pythonが冗長モードで実行された場合はverbose
属性が真になり、デバッグモードで実行された場合はdebug
が真になります。 これらの属性はすべて読み取り専用です。 (Christian Heimesによる寄稿。)新しい関数
getsizeof()
は、Pythonオブジェクトを受け取り、オブジェクトが使用するメモリの量をバイト単位で返します。 組み込みオブジェクトは正しい結果を返します。 サードパーティの拡張機能はそうではないかもしれませんが、オブジェクトのサイズを返すために__sizeof__()
メソッドを定義できます。 (RobertSchuppeniesによる寄稿; :issue: `2898` 。)sys.getprofile()および sys.gettrace()を呼び出すことにより、現在のプロファイラーおよびトレーサー関数を判別できるようになりました。 (GeorgBrandlによる寄稿; :issue: `1648` 。)
tarfile モジュールは、すでにサポートされていたPOSIX.1-1988(ustar)およびGNU tar形式に加えて、POSIX.1-2001(pax)tarfileをサポートするようになりました。 デフォルトの形式はGNUtarです。
format
パラメーターを指定して、別の形式を使用してファイルを開きます。tar = tarfile.open("output.tar", "w", format=tarfile.PAX_FORMAT)
新しい
encoding
およびerrors
パラメーターは、文字変換のエンコードおよびエラー処理スキームを指定します。'strict'
、'ignore'
、および'replace'
は、Pythonがエラーを処理できる3つの標準的な方法です。'utf-8'
は、不正な文字をUTF-8表現に置き換える特別な値です。 (PAX形式はUnicodeファイル名をサポートしているため、文字変換が発生します。デフォルトはUTF-8エンコードです。)TarFile.add()
メソッドは、アーカイブから特定のファイル名を除外するために使用できる関数であるexclude
引数を受け入れるようになりました。 関数はファイル名を取得し、ファイルを除外する必要がある場合はtrueを返し、アーカイブする必要がある場合はfalseを返す必要があります。 この関数は、最初にadd()
に渡された名前と、再帰的に追加されたディレクトリ内のファイルの名前の両方に適用されます。(すべての変更はLarsGustäbelによって提供されました)。
オプションの
timeout
パラメーターが telnetlib.Telnet クラスコンストラクターに追加され、秒単位で測定されるタイムアウトを指定しました。 (ファクンドバティスタによって追加されました。)tempfile.NamedTemporaryFile クラスは通常、ファイルが閉じられたときに作成した一時ファイルを削除します。 この動作は、
delete=False
をコンストラクターに渡すことで変更できるようになりました。 (DamienMillerによる寄稿; :issue: `1537850` 。)新しいクラス
SpooledTemporaryFile
は一時ファイルのように動作しますが、最大サイズを超えるまでそのデータをメモリに保存します。 その制限に達すると、コンテンツはディスク上の一時ファイルに書き込まれます。 (DustinJによる寄稿。 ミッチェル。)NamedTemporaryFile
クラスとSpooledTemporaryFile
クラスはどちらもコンテキストマネージャーとして機能するため、with tempfile.NamedTemporaryFile() as tmp: ...
と記述できます。 (AlexanderBelopolskyによる寄稿; :issue: `2021` 。)test.test_support
モジュールは、テストの作成に役立つ多くのコンテキストマネージャーを獲得しました。EnvironmentVarGuard()
は、環境変数を一時的に変更し、それらを古い値に自動的に復元するコンテキストマネージャーです。別のコンテキストマネージャー
TransientResource
は、使用できる場合とできない場合があるリソースへの呼び出しを囲むことができます。 指定された例外のリストをキャッチして無視します。 たとえば、ネットワークテストでは、外部Webサイトに接続するときに特定の障害を無視する場合があります。with test_support.TransientResource(IOError, errno=errno.ETIMEDOUT): f = urllib.urlopen('https://sf.net') ...
最後に、
check_warnings()
は、warning
モジュールの警告フィルターをリセットし、トリガーされたすべての警告メッセージを記録するオブジェクトを返します(:issue: `3781` ):with test_support.check_warnings() as wrec: warnings.simplefilter("always") # ... code that triggers a warning ... assert str(wrec.message) == "function is outdated" assert len(wrec.warnings) == 1, "Multiple warnings raised"
(Brett Cannonによる寄稿。)
textwrap モジュールは、引数として
drop_whitespace=False
を指定することにより、新しく作成された行の最初と最後にある既存の空白を保持できるようになりました。>>> S = """This sentence has a bunch of ... extra whitespace.""" >>> print textwrap.fill(S, width=15) This sentence has a bunch of extra whitespace. >>> print textwrap.fill(S, drop_whitespace=False, width=15) This sentence has a bunch of extra whitespace. >>>
(DwayneBaileyによる寄稿; :issue: `1581073` 。)
threading モジュールAPIは、
setDaemon()
およびisDaemon()
メソッドの代わりにdaemon
などのプロパティを使用するように変更され、一部のメソッドはアンダースコアを使用するように名前が変更されましたキャメルケースの代わりに; たとえば、activeCount()
メソッドの名前はactive_count()
に変更されます。 モジュールの2.6バージョンと3.0バージョンはどちらも、同じプロパティと名前が変更されたメソッドをサポートしていますが、古いメソッドを削除しないでください。 Python3.xでの古いAPIの非推奨の日付は設定されていません。 古いAPIはどの2.xバージョンでも削除されません。 (何人かの人々、特にベンジャミン・ピーターソンによって実行されました。)threading モジュールの
Thread
オブジェクトは、スレッドの識別子であるゼロ以外の整数を返すident
プロパティを取得しました。 (GregoryPによる寄稿。 スミス; :issue: `2871` 。)timeit モジュールは、タイミングをとるステートメントとセットアップコードの文字列だけでなく呼び出し可能オブジェクトも受け入れるようになりました。
Timer
インスタンスを作成するための2つの便利な関数が追加されました。repeat(stmt, setup, time, repeat, number)
とtimeit(stmt, setup, time, number)
はインスタンスを作成し、対応するメソッドを呼び出します。 (ErikDemaineによる寄稿; :issue: `1533909` 。)Tkinter
モジュールは、オプションのリストとタプルを受け入れるようになり、結果の値をTcl / Tkに渡す前に、要素をスペースで区切ります。 (GuilhermePoloによる寄稿; :issue: `2906` 。)タートルグラフィックス用の turtle モジュールは、GregorLinglによって大幅に強化されました。 モジュールの新機能は次のとおりです。
カメの動きと回転のより良いアニメーション。
新しい
delay()
、tracer()
、およびspeed()
メソッドを使用して、カメの動きを制御します。カメに新しい形状を設定し、新しい座標系を定義する機能。
Turtlesには、アクションをロールバックできる
undo()
メソッドがあります。マウスやキーボードのアクティビティなどの入力イベントに反応するためのシンプルなサポートにより、シンプルなゲームを作成できます。
turtle.cfg
ファイルを使用して、タートルの画面の開始時の外観をカスタマイズできます。モジュールのdocstringは、別の言語に翻訳された新しいdocstringに置き換えることができます。
オプションの
timeout
パラメーターがurllib.urlopen()
関数とurllib.ftpwrapper
クラスコンストラクター、およびurllib2.urlopen()
関数に追加されました。 このパラメーターは、秒単位で測定されるタイムアウトを指定します。 例えば:>>> u = urllib2.urlopen("http://slow.example.com", timeout=3) Traceback (most recent call last): ... urllib2.URLError: <urlopen error timed out> >>>
(ファクンドバティスタによって追加されました。)
unicodedata モジュールによって提供されるUnicodeデータベースがバージョン5.1.0に更新されました。 (MartinvonLöwisによって更新; :issue: `3811` 。)
警告モジュールの
formatwarning()
およびshowwarning()
は、ソースコードの行を提供するために使用できるオプションの line 引数を取得しました。 (:issue: `1631171` の一部として追加されました。これは警告モジュールの一部をCコードで再実装しました。)新しい関数
catch_warnings()
は、テスト目的のコンテキストマネージャーであり、警告フィルターを一時的に変更してから、元の値に戻すことができます(:issue: `3781` )。XML-RPC
SimpleXMLRPCServer
およびDocXMLRPCServer
クラスは、 bind_and_activate コンストラクターパラメーターとしてFalse
を渡すことにより、すぐに開いてソケットにバインドされないようにすることができます。 これを使用して、server_bind()
およびserver_activate()
メソッドを呼び出してソケットを開き、接続のリッスンを開始する前に、インスタンスのallow_reuse_address
属性を変更できます。 (PeterParenteによる寄稿; :issue: `1599845` 。)SimpleXMLRPCServer
には_send_traceback_header
属性もあります。 trueの場合、例外とフォーマットされたトレースバックは、HTTPヘッダー「X-Exception」と「X-Traceback」として返されます。 この機能はデバッグのみを目的としており、トレースバックによってパスワードやその他の機密情報が明らかになる可能性があるため、運用サーバーでは使用しないでください。 (GoogleのSummer of Code 2007のプロジェクトの一環として、Alan McIntyreによって寄稿されました。)xmlrpclib
モジュールは、 datetime.date および datetime.time をxmlrpclib.DateTime
タイプに自動的に変換しなくなりました。 変換セマンティクスは、すべてのアプリケーションで必ずしも正しいとは限りませんでした。xmlrpclib
を使用するコードは、date
および time インスタンスを変換する必要があります。 (:issue: `1330538` )このコードは、1900年より前の日付(RalfSchmittによる寄稿; :issue:` 2014` )および[ XML-RPC応答のX167X] (RikuLindbladによる寄稿; :issue: `2985` )。zipfile モジュールの
ZipFile
クラスに、extract()
およびextractall()
メソッドが追加され、アーカイブ内の単一のファイルまたはすべてのファイルが現在のディレクトリに解凍されます。または指定されたディレクトリへ:z = zipfile.ZipFile('python-251.zip') # Unpack a single file, writing it relative # to the /tmp directory. z.extract('Python/sysmodule.c', '/tmp') # Unpack all the files in the archive. z.extractall()
(AlanMcIntyreによる寄稿; :issue: `467924` 。)
open()、
read()
、およびextract()
メソッドは、ファイル名またはZipInfo
オブジェクトのいずれかを取ることができるようになりました。 これは、アーカイブに誤って重複したファイル名が含まれている場合に役立ちます。 (GrahamHorlerによる寄稿; :issue: `1775025` 。)最後に、 zipfile は、アーカイブファイルにUnicodeファイル名を使用できるようになりました。 (AlexeyBorzenkovによる寄稿; :issue: `1734346` 。)
ast モジュール
ast モジュールは、Pythonコードの抽象構文ツリー表現を提供し、Armin Ronacherは、さまざまな一般的なタスクを実行する一連のヘルパー関数を提供しました。 これらは、HTMLテンプレートパッケージ、コードアナライザー、およびPythonコードを処理する同様のツールに役立ちます。
parse()
関数は式を受け取り、ASTを返します。 dump()
関数は、デバッグに適したツリーの表現を出力します。
import ast
t = ast.parse("""
d = {}
for i in 'abcdefghijklm':
d[i + i] = ord(i) - ord('a') + 1
print d
""")
print ast.dump(t)
これにより、深くネストされたツリーが出力されます。
Module(body=[
Assign(targets=[
Name(id='d', ctx=Store())
], value=Dict(keys=[], values=[]))
For(target=Name(id='i', ctx=Store()),
iter=Str(s='abcdefghijklm'), body=[
Assign(targets=[
Subscript(value=
Name(id='d', ctx=Load()),
slice=
Index(value=
BinOp(left=Name(id='i', ctx=Load()), op=Add(),
right=Name(id='i', ctx=Load()))), ctx=Store())
], value=
BinOp(left=
BinOp(left=
Call(func=
Name(id='ord', ctx=Load()), args=[
Name(id='i', ctx=Load())
], keywords=[], starargs=None, kwargs=None),
op=Sub(), right=Call(func=
Name(id='ord', ctx=Load()), args=[
Str(s='a')
], keywords=[], starargs=None, kwargs=None)),
op=Add(), right=Num(n=1)))
], orelse=[])
Print(dest=None, values=[
Name(id='d', ctx=Load())
], nl=True)
])
literal_eval()
メソッドは、リテラル式を表す文字列またはASTを受け取り、それを解析して評価し、結果の値を返します。 リテラル式は、文字列、数値、辞書などのみを含むPython式です。 ただし、ステートメントや関数呼び出しはありません。 式を評価する必要があるが、 eval()呼び出しを使用することによるセキュリティリスクを受け入れることができない場合、literal_eval()
はそれを安全に処理します。
>>> literal = '("a", "b", {2:4, 3:8, 1:2})'
>>> print ast.literal_eval(literal)
('a', 'b', {1: 2, 2: 4, 3: 8})
>>> print ast.literal_eval('"a" + "b"')
Traceback (most recent call last):
...
ValueError: malformed string
このモジュールには、ASTをトラバースおよび変更するためのNodeVisitor
クラスとNodeTransformer
クラス、および行番号の変更などの一般的な変換のための関数も含まれています。
future_builtinsモジュール
Python 3.0は、組み込み関数のレパートリーに多くの変更を加えます。ほとんどの変更は、互換性が失われるため、Python2.xシリーズに導入できません。 future_builtins
モジュールは、3.0互換のコードを作成するときにインポートできるこれらの組み込み関数のバージョンを提供します。
このモジュールの機能には、現在次のものが含まれています。
ascii(obj)
: repr()と同等です。 Python 3.0では、 repr()はUnicode文字列を返し、 ascii()は純粋なASCIIバイト文字列を返します。filter(predicate, iterable)
、map(func, iterable1, ...)
:リストを返す2.xビルトインとは異なり、3.0バージョンはイテレーターを返します。hex(value)
、oct(value)
:__hex__()
または__oct__()
メソッドを呼び出す代わりに、これらのバージョンは__index__()
メソッドを呼び出し、結果を次のように変換します。 16進数または8進数。 oct()は、結果に新しい0o
表記を使用します。
json モジュール:JavaScriptオブジェクト表記
新しい json モジュールは、JSON(Javascript Object Notation)でのPython型のエンコードとデコードをサポートします。 JSONは、Webアプリケーションでよく使用される軽量の交換形式です。 JSONの詳細については、 http://www.json.org を参照してください。
json には、ほとんどの組み込みPythonタイプのデコードとエンコードがサポートされています。 次の例では、辞書をエンコードおよびデコードします。
>>> import json
>>> data = {"spam": "foo", "parrot": 42}
>>> in_json = json.dumps(data) # Encode the data
>>> in_json
'{"parrot": 42, "spam": "foo"}'
>>> json.loads(in_json) # Decode into a Python object
{"spam": "foo", "parrot": 42}
より多くのタイプをサポートするために、独自のデコーダーとエンコーダーを作成することも可能です。 JSON文字列のきれいな印刷もサポートされています。
json (元々はsimplejsonと呼ばれていました)はBobIppolitoによって作成されました。
plistlib モジュール:プロパティリストパーサー
.plist
形式は、Mac OS Xで一般的に使用され、基本的なデータ型(数値、文字列、リスト、および辞書)をXMLベースの形式にシリアル化して格納します。 これは、データ型のXML-RPCシリアル化に似ています。
主にMacOS Xで使用されていますが、この形式にはMac固有のものはなく、Pythonの実装はPythonがサポートするすべてのプラットフォームで機能するため、 plistlib モジュールは標準ライブラリに昇格しています。
モジュールの使用は簡単です。
import sys
import plistlib
import datetime
# Create data structure
data_struct = dict(lastAccessed=datetime.datetime.now(),
version=1,
categories=('Personal','Shared','Private'))
# Create string containing XML.
plist_str = plistlib.writePlistToString(data_struct)
new_struct = plistlib.readPlistFromString(plist_str)
print data_struct
print new_struct
# Write data structure to a file and read it back.
plistlib.writePlist(data_struct, '/tmp/customizations.plist')
new_struct = plistlib.readPlist('/tmp/customizations.plist')
# read/writePlist accepts file-like objects as well as paths.
plistlib.writePlist(data_struct, sys.stdout)
ctypesの機能強化
Thomas Hellerは、 ctypes モジュールの保守と拡張を続けました。
ctypes は、C99 bool
タイプを表すc_bool
データ型をサポートするようになりました。 (DavidRemahlによる寄稿; :issue: `1649190` 。)
ctypes 文字列、バッファー、および配列型は、(start, stop, step)
のさまざまな組み合わせが提供される拡張スライス構文のサポートを改善しました。 (Thomas Woutersによって実装されました。)
すべての ctypes データ型は、提供されたバッファーオブジェクトに基づいてctypesインスタンスを作成するfrom_buffer()
およびfrom_buffer_copy()
メソッドをサポートするようになりました。 from_buffer_copy()
はオブジェクトの内容をコピーし、from_buffer()
は同じメモリ領域を共有します。
新しい呼び出し規約は、 ctypes に、ラップされた各呼び出しの開始時にerrno
またはWin32LastError変数をクリアするように指示します。 (ThomasHellerによって実装されました; :issue: `1798` 。)
関数呼び出し後にUnix errno
変数を取得できるようになりました。 ラップされた関数を作成するときに、use_errno=True
をキーワードパラメーターとしてDLL()
関数に指定してから、モジュールレベルのメソッドset_errno()
およびget_errno()
を呼び出すことができます。エラー値を設定して取得します。
Win32 LastError変数は、DLL()
、OleDLL()
、およびWinDLL()
関数で同様にサポートされています。 キーワードパラメータとしてuse_last_error=True
を指定してから、モジュールレベルのメソッドset_last_error()
およびget_last_error()
を呼び出します。
ctypesインスタンスへのポインターを取得するために使用されるbyref()
関数に、返されたポインターに追加されるバイトカウントであるオプションの offset パラメーターが追加されました。
改善されたSSLサポート
Bill Janssenは、 OpenSSL ライブラリの上に構築された新しいモジュール ssl を追加することにより、Python2.6のSecureSocketsLayerのサポートを大幅に改善しました。 この新しいモジュールは、ネゴシエートされたプロトコル、使用されたX.509証明書をより詳細に制御し、Pythonで(クライアントではなく)SSLサーバーを作成するためのサポートを強化します。 socket モジュールの既存のSSLサポートは削除されておらず、引き続き機能しますが、Python3.0では削除されます。
新しいモジュールを使用するには、最初に通常の方法でTCP接続を作成してから、それを ssl.wrap_socket()関数に渡す必要があります。 getpeercert()
メソッドを呼び出すことで、証明書が必要かどうかを指定したり、証明書情報を取得したりすることができます。
非推奨と削除
文字列の例外は削除されました。 それらを使おうとすると、 TypeError が発生します。
PEP 352 で指定されているように、 Exception インターフェイスへの変更は引き続き行われます。 2.6では、
message
属性は非推奨になり、args
属性が優先されます。(3.0-警告モード)Python 3.0は、多くの古いモジュールを削除し、他のモジュールの名前を変更する再編成された標準ライブラリを備えています。 3.0警告モードで実行されているPython2.6は、これらのモジュールがインポートされるときに警告を発します。
非推奨のモジュールのリストは、
audiodev
、bgenlocations
、buildtools
、bundlebuilder
、Canvas
、compiler
、[ X101X] 、dl
、fpformat
、gensuitemodule
、ihooks
、imageop
、imgfile
、[X184X ] 、mhlib
、mimetools
、multifile
、new
、pure
、statvfs
、sunaudiodev
、test.testall
、およびtoaiff
。gopherlib
モジュールは削除されました。MimeWriter
モジュールとmimify
モジュールは非推奨になりました。 代わりに email パッケージを使用してください。md5
モジュールは非推奨になりました。 代わりに hashlib モジュールを使用してください。posixfile
モジュールは非推奨になりました。 fcntl.lockf()は、より優れたロックを提供します。popen2
モジュールは非推奨になりました。 サブプロセスモジュールを使用します。rgbimg
モジュールは削除されました。sets
モジュールは非推奨になりました。 組み込みの set および frozenset タイプを使用することをお勧めします。sha
モジュールは非推奨になりました。 代わりに hashlib モジュールを使用してください。
ビルドとCAPIの変更
PythonのビルドプロセスとCAPIへの変更は次のとおりです。
PythonはC89コンパイラでコンパイルする必要があります(19年後!)。 これは、Pythonソースツリーが、C89標準ライブラリにある
memmove()
およびstrerror()
の独自の実装を削除したことを意味します。Python2.6はMicrosoftVisual Studio 2008(バージョン9.0)でビルドでき、これが新しいデフォルトのコンパイラです。 ビルドファイルについては、
PCbuild
ディレクトリを参照してください。 (Christian Heimesによって実装されました。)Mac OS Xでは、Python2.6を4ウェイユニバーサルビルドとしてコンパイルできます。 configure スクリプトは
--with-universal-archs=[32-bit|64-bit|all]
スイッチを使用して、バイナリが32ビットアーキテクチャ(x86、PowerPC)、64ビット(x86-64、およびPPC-64)用に構築されているかどうかを制御できます。または両方。 (Ronald Oussorenによる寄稿。)BerkeleyDBモジュールには、
bsddb.db.api
として利用可能なCAPIオブジェクトが含まれるようになりました。 このオブジェクトは、bsddb
モジュールを独自の目的で使用したい他のC拡張機能で使用できます。 (Duncan Grisbyによる寄稿。)PEP 3118セクションで前述した新しいバッファインターフェイスには、 PyObject_GetBuffer()と PyBuffer_Release()、およびその他のいくつかの関数が追加されています。
PythonによるCstdioライブラリの使用は、スレッドセーフであるか、少なくとも基盤となるライブラリと同じくらいスレッドセーフです。 別のスレッドがオブジェクトからの読み取りまたはオブジェクトへの書き込み中に、あるスレッドがファイルオブジェクトを閉じた場合、長年の潜在的なバグが発生しました。 2.6では、ファイルオブジェクトには、
PyFile_IncUseCount()
およびPyFile_DecUseCount()
関数によって操作される参照カウントがあります。 参照カウントがゼロでない限り、ファイルオブジェクトを閉じることはできません。PyFile_IncUseCount()
は、GILが保持されている間に、FILE *
ポインタを使用してI / O操作を実行する前に呼び出す必要があり、PyFile_DecUseCount()
は、GILが再実行された直後に呼び出す必要があります。 -獲得。 (AntoinePitrouとGregoryPによる寄稿。 スミス。)2つの異なるスレッドでモジュールを同時にインポートしても、デッドロックが発生しなくなりました。 ImportError が発生するようになりました。 新しいAPI関数 PyImport_ImportModuleNoBlock()は、最初に
sys.modules
でモジュールを検索し、インポートロックを取得した後にそれをインポートしようとします。 インポートロックが別のスレッドによって保持されている場合、 ImportError が発生します。 (Christian Heimesによる寄稿。)いくつかの関数は、プラットフォームの浮動小数点サポートに関する情報を返します。 PyFloat_GetMax()は表現可能な最大の浮動小数点値を返し、 PyFloat_GetMin()は最小の正の値を返します。 PyFloat_GetInfo()は、
"mant_dig"
(仮数の桁数)、"epsilon"
(最小)など、float.h
ファイルからの詳細情報を含むオブジェクトを返します。 1.0と表現可能な次に大きい値の差)、および他のいくつか。 (ChristianHeimesによる寄稿; :issue: `1534` 。)PyComplex_AsCComplex()を使用するC関数およびメソッドは、
__complex__()
メソッドを持つ引数を受け入れるようになりました。 特に、 cmath モジュールの関数は、このメソッドでオブジェクトを受け入れるようになりました。 これは、Python3.0の変更のバックポートです。 (MarkDickinsonによる寄稿; :issue: `1675423` 。)PythonのCAPIには、大文字と小文字を区別しない文字列比較のための2つの関数、
PyOS_stricmp(char*, char*)
とPyOS_strnicmp(char*, char*, Py_ssize_t)
が含まれるようになりました。 (ChristianHeimesによる寄稿; :issue: `1635` 。)多くのC拡張機能は、
init*
関数でモジュールの辞書に整数と文字列を追加するための独自の小さなマクロを定義しています。 Python 2.6は、モジュールに値を追加するための標準マクロ PyModule_AddStringMacro および PyModule_AddIntMacro()を最終的に定義します。 (Christian Heimesによる寄稿。)一部のマクロは、関数ではなくマクロであることを明確にするために、3.0と2.6の両方で名前が変更されました。
Py_Size()
は Py_SIZE()になり、Py_Type()
は Py_TYPE()になり、Py_Refcnt()
は Py_REFCNT()になりました]。 大文字と小文字が混在するマクロは、下位互換性のためにPython2.6でも引き続き使用できます。 (:issue: `1629` )Distutilsは、Pythonのデバッグバージョンで実行するときに、ビルドしたC拡張機能を別のディレクトリに配置するようになりました。 (CollinWinterによる寄稿; :issue: `1530959` 。)
整数や文字列などのいくつかの基本的なデータ型は、再利用できるオブジェクトの内部空きリストを維持します。 これらのフリーリストのデータ構造は、命名規則に従います。変数には常に
free_list
という名前が付けられ、カウンターには常にnumfree
という名前が付けられ、マクロPy<typename>_MAXFREELIST
が常に定義されます。新しいMakefileターゲット「makepatchcheck」は、パッチを作成するためのPythonソースツリーを準備します。変更されたすべての
.py
ファイルの末尾の空白を修正し、ドキュメントが変更されたかどうかを確認し、Misc/ACKS
およびMisc/NEWS
ファイルが更新されました。 (Brett Cannonによる寄稿。)もう1つの新しいターゲット「makeprofile-opt」は、GCCのプロファイルガイド付き最適化を使用してPythonバイナリをコンパイルします。 プロファイリングを有効にしてPythonをコンパイルし、テストスイートを実行して一連のプロファイリング結果を取得し、最適化のためにこれらの結果を使用してコンパイルします。 (GregoryPによる寄稿。 スミス。)
ポート固有の変更:Windows
Windows 95、98、ME、およびNT4のサポートは終了しました。 Python 2.6には、少なくともWindows 2000SP4が必要です。
Windowsの新しいデフォルトコンパイラはVisualStudio 2008(バージョン9.0)です。 Visual Studio 2003(バージョン7.1)および2005(バージョン8.0)のビルドディレクトリは、PC /ディレクトリに移動されました。 新しい
PCbuild
ディレクトリは、X64のクロスコンパイル、デバッグビルド、およびプロファイルガイド付き最適化(PGO)をサポートします。 PGOビルドは、通常のビルドよりも約10 % fアスターです。 (Amaury Forgeotd'ArcとMartinvonLöwisの助けを借りてChristianHeimesによって寄稿されました。)msvcrt モジュールは、コンソールI / OAPIの通常文字とワイド文字の両方のバリアントをサポートするようになりました。
getwch()
関数は、getwche()
関数と同様に、キー押下を読み取り、Unicode値を返します。putwch()
関数はUnicode文字を受け取り、それをコンソールに書き込みます。 (Christian Heimesによる寄稿。)os.path.expandvars()は、環境変数を「%var%」の形式で展開し、「〜user」はユーザーのホームディレクトリパスに展開されます。 (JosiahCarlsonによる寄稿; :issue: `957650` 。)
socket モジュールのソケットオブジェクトには、
WSAIoctl()
システムインターフェイスへの制限されたインターフェイスを提供するioctl()
メソッドが含まれるようになりました。_winreg
モジュールには、入力文字列内の%NAME%
などの環境変数参照を展開する関数ExpandEnvironmentStrings()
が含まれるようになりました。 このモジュールによって提供されるハンドルオブジェクトは、コンテキストプロトコルをサポートするようになったため、 with ステートメントで使用できます。 (Christian Heimesによる寄稿。)_winreg
は、x64システムのサポートも強化されており、DisableReflectionKey()
、EnableReflectionKey()
、およびQueryReflectionKey()
関数が公開され、32ビットプロセスのレジストリリフレクションが有効または無効になります。 64ビットシステムで実行されています。 (:issue: `1753245` )msilib モジュールの
Record
オブジェクトは、フィールド値を整数または文字列として返すGetInteger()
およびGetString()
メソッドを取得しました。 (FlorisBruynoogheによる寄稿; :issue: `2125` 。)
ポート固有の変更:Mac OS X
- Pythonのフレームワークビルドをコンパイルするときに、 configure スクリプトに
--with-framework-name=
オプションを指定することで、使用するフレームワーク名を指定できるようになりました。 macfs
モジュールは削除されました。 これは、macfs
モジュールに依存していたため、macostools.touched()
機能を削除する必要がありました。 (:issue: `1490190` )- 他の多くのMacOSモジュールは非推奨になり、Python 3.0で削除されます:
_builtinSuites
、aepack
、aetools
、aetypes
、applesingle
、appletrawmain
、appletrunner
、argvemulator
、Audio_mac
、autoGIL
、Carbon
、cfmfile
、CodeWarrior
、ColorPicker
、EasyDialogs
、Explorer
、Finder
、FrameWork
、findertools
、[ X309X] 、icglue
、icopen
、macerrors
、MacOS
、macfs
、macostools
、[X400X ] 、MiniAEFrame
、Nav
、Netscape
、OSATerminology
、pimp
、PixMapWrapper
、StdSuites
、SystemEvents
、Terminal
、およびterminalcommand
。
ポート固有の変更:IRIX
多くの古いIRIX固有のモジュールは非推奨になり、Python 3.0で削除されます:al
およびAL
、cd
、cddb
、 [ X140X]、CL
およびcl
、DEVICE
、ERRNO
、FILE
、FL
および [X226X ]、flp
、fm
、GET
、GLWS
、GL
、gl
、IN
、IOCTL
、jpeg
、panelparser
、readcd
、SV
およびsv
、torgb
、 videoreader
、およびWAIT
。
Python2.6への移植
このセクションでは、コードの変更が必要になる可能性のある、前述の変更とその他のバグ修正を示します。
ハッシュ可能であると想定されていないクラスは、事実を示すために定義に
__hash__ = None
を設定する必要があります。文字列の例外は削除されました。 それらを使おうとすると、 TypeError が発生します。
collections.deque の
__init__()
メソッドは、イテラブルから要素を追加する前に、dequeの既存のコンテンツをすべてクリアするようになりました。 この変更により、動作がlist.__init__()
と一致するようになります。object .__ init __()は、以前は任意の引数とキーワード引数を受け入れ、それらを無視していました。 Python 2.6では、これは許可されなくなり、 TypeError が発生します。 これは、オブジェクトで対応するメソッドを呼び出すことになる
__init__()
メソッドに影響します(おそらく super()を使用することにより)。 議論については、:issue: `1683368` を参照してください。Decimal
コンストラクターは、文字列が渡されたときに先頭と末尾の空白を受け入れるようになりました。 以前は、InvalidOperation
例外が発生していました。 一方、Context
オブジェクトのcreate_decimal()
メソッドは、余分な空白を明示的に許可しないようになり、ConversionSyntax
例外が発生します。実装上の事故により、組み込みの __ import __()関数にファイルパスを渡すと、実際には指定されたファイルがインポートされます。 ただし、これは機能することを意図したものではなく、実装はこのケースを明示的にチェックし、 ImportError を発生させます。
C API: PyImport_Import()および PyImport_ImportModule()関数は、デフォルトで相対インポートではなく絶対インポートになりました。 これは、他のモジュールをインポートするC拡張機能に影響します。
C API:ハッシュ可能であってはならない拡張データ型は、
tp_hash
スロットを PyObject_HashNotImplemented()に定義する必要があります。socket モジュール例外 socket.error が IOError から継承するようになりました。 以前は
StandardError
のサブクラスではありませんでしたが、現在は IOError を介してサブクラスになっています。 (GregoryPによって実装されました。 スミス; :issue: `1706815` 。)xmlrpclib
モジュールは、 datetime.date および datetime.time をxmlrpclib.DateTime
タイプに自動的に変換しなくなりました。 変換セマンティクスは、すべてのアプリケーションで必ずしも正しいとは限りませんでした。xmlrpclib
を使用するコードは、date
および time インスタンスを変換する必要があります。 (:issue: `1330538` )(3.0-警告モード) Exception クラスは、スライスまたはインデックスアクセスを使用してアクセスしたときに警告するようになりました。 Exception が、タプルが段階的に廃止されているように動作する。
(3.0-警告モード)比較メソッドを実装していない2つの辞書または2つのオブジェクト間の不等式比較は、警告として報告されます。
dict1 == dict2
は引き続き機能しますが、dict1 < dict2
は段階的に廃止されます。Pythonのスコープルールの実装の詳細であるセル間の比較も、3.0では完全に禁止されているため、警告が発生します。
謝辞
著者は、この記事のさまざまなドラフトについて提案、修正、支援を提供してくれた次の人々に感謝します:Georg Brandl、Steve Brown、Nick Coghlan、Ralph Corderoy、Jim Jewett、Kent Johnson、Chris Lambacher、Martin Michlmayr、Antoine Pitrou、ブライアンワーナー。