pytho****@googl*****
pytho****@googl*****
2011年 2月 22日 (火) 10:29:03 JST
Revision: fbab863787 Author: INADA Naoki <inada****@klab*****> Date: Mon Feb 21 17:27:55 2011 Log: Update to 2.6.6: library/weakref.rst http://code.google.com/p/python-doc-ja/source/detail?r=fbab863787 Modified: /library/weakref.rst ======================================= --- /library/weakref.rst Sat Nov 27 10:59:46 2010 +++ /library/weakref.rst Mon Feb 21 17:27:55 2011 @@ -1,4 +1,3 @@ - :mod:`weakref` --- 弱参照 ========================= @@ -12,35 +11,43 @@ .. versionadded:: 2.1 -:mod:`weakref` モジュールは、Pythonプログラマがオブジェクトへの :dfn:`弱参 照(weak refarence)` -を作成できるようにします。 - -以下では、用語 :dfn:`リファレント (referent)` は弱参照が参照するオブジェク トを意味します。 - -オブジェクトに対する弱参照は、そのオブジェクトを生かしておくのに十分な条件 にはなりません: あるリファレントに対する参照が弱参照しか -残っていない場合、ガベージコレクション(:term:`garbage collection`)機構は自 由にリファレントを破壊し、そのメモリを別の用途に再利用できます。弱参照の主な 用途は、 -巨大なオブジェクトを保持するキャッシュやマップ型の実装において、キャッシュ やマップ型にあるという理由だけオブジェクトを存続させたくない場合です。 - -例えば、巨大なバイナリ画像のオブジェクトがたくさんあり、それぞれに名前を関 連付けたいとします。 Python の辞書型を使って -名前を画像に対応付けたり画像を名前に対応付けたりすると、画像オブジェクトは 辞書内のキーや値に使われているため存続しつづける -ことになります。 :mod:`weakref` モジュールが提供してい る :class:`WeakKeyDictionary` や -:class:`WeakValueDictionary` クラスはその代用で、対応付けを構築するのに弱参 照を使い、キャッシュや -マップ型に存在するという理由だけでオブジェクトを存続させないようにします。 例えば、もしある画像オブジェクトが -:class:`WeakValueDictionary` の値になっていた場合、最後に残った画像オブジェ クトへの参照を -弱参照マップ型が保持していれば、ガーベジコレクションはこのオブジェクトを再 利用でき、画像オブジェクトに対する弱参照内の対応付けはそのまま削除されます。 - -:class:`WeakKeyDictionary` や :class:`WeakValueDictionary` は -弱参照を使って実装されていて、キーや値がガーベジコレクションによって回収さ れたことを弱参照辞書に知らせるような弱参照オブジェクトのコールバック関数を -設定しています。 -ほとんどのプログラムが、いずれかの弱参照辞書型を使うだけで必要を満たせるは ずです --- 自作の弱参照辞書を直接作成する必要は普通はありません。とはいえ、 -弱参照辞書の実装に使われている低水準の機構は、高度な利用を行う際に恩恵をう けられるよう :mod:`weakref` モジュールで公開されています。 - -.. .. note:: -.. -.. Weak references to an object are cleared before the object's :meth:`__del__` -.. is called, to ensure that the weak reference callback (if any) finds the -.. object still alive. -.. +:mod:`weakref` モジュールは、Pythonプログラマがオブジェクトへの弱参照 +(:dfn:`weak refarence`)を作成できるようにします。 + +以下では、用語 リファレント(:dfn:`referent`) は弱参照が参照するオブジェクト を +意味します。 + +オブジェクトに対する弱参照は、そのオブジェクトを生かしておく十分条件にはな りません: +あるリファレントに対する参照が弱参照しか残っていない場合、ガベージコレクシ ョン +(:term:`garbage collection`)機構は自由にリファレントを破壊し、そのメモリを 別の用途に再利用できます。 +弱参照の主な用途は、巨大なオブジェクトを保持するキャッシュやマップ型の実装 において、 +キャッシュやマップ型にあるという理由だけオブジェクトを存続させたくない場合 です。 + +例えば、巨大なバイナリ画像のオブジェクトがたくさんあり、それぞれに名前を +関連付けたいとします。 Python の辞書型を使って名前を画像に対応付けたり画像 を +名前に対応付けたりすると、画像オブジェクトは辞書内のキーや値に使われている ため +存続しつづけることになります。 :mod:`weakref` モジュールが提供している +:class:`WeakKeyDictionary` や :class:`WeakValueDictionary` クラスはその代用 で、 +対応付けを構築するのに弱参照を使い、キャッシュやマップ型に存在するという +理由だけでオブジェクトを存続させないようにします。 +例えば、もしある画像オブジェクトが :class:`WeakValueDictionary` の +値になっていた場合、最後に残った画像オブジェクトへの参照を弱参照マップ型が +保持していれば、ガーベジコレクションはこのオブジェクトを再利用でき、 +画像オブジェクトに対する弱参照内の対応付けは削除されます。 + +:class:`WeakKeyDictionary` や :class:`WeakValueDictionary` は弱参照を使って +実装されていて、キーや値がガベージコレクションによって回収されたことを +弱参照辞書に知らせるような弱参照オブジェクトのコールバック関数を設定してい ます。 +ほとんどのプログラムが、いずれかの弱参照辞書型を使うだけで必要を満たせるは ずです --- +自作の弱参照辞書を直接作成する必要は普通はありません。 +とはいえ、高度な使い方をするために、弱参照辞書の実装に使われている低水準の 機構は +:mod:`weakref` モジュールで公開されています。 + +.. .. note: + + Weak references to an object are cleared before the object's :meth:`__del__` + is called, to ensure that the weak reference callback (if any) finds the + object still alive. .. note:: @@ -48,10 +55,12 @@ 前にクリアされます。弱参照のコールバック呼ばれるときに、そのオブジェクト がまだ\ 生存しているためです。 -すべてのオブジェクトを弱参照できるわけではありません。弱参照できるオブジェ クトは、クラスインスタンス、(Cではなく) Pythonで書かれた関数、 -(束縛および非束縛の両方の)メソッド、 :class:`set` およ び :class:`frozenset` -型、ファイルオブジェクト、ジェネレータ(:term:`generator`)、型オブジェク ト、 :mod:`bsddb` モジュールの :class:`DBcursor` 型、ソケット型、 -:class:`array` 型、 :class:`deque` 型、および正規表現パターンオブジェクトで す。 +すべてのオブジェクトを弱参照できるわけではありません。弱参照できるオブジェ クトは、 +クラスインスタンス、(Cではなく) Pythonで書かれた関数、(束縛および非束縛の両 方の) +メソッド、 :class:`set` と :class:`frozenset` 型、ファイルオブジェクト、 +ジェネレータ(:term:`generator`)、 type オブジェクト、 :mod:`bsddb` モジュー ルの +:class:`DBcursor` 型、ソケット型、 :class:`array` 型、 :class:`deque` 型、 +正規表現パターンオブジェクトです。 .. versionchanged:: 2.4 ファイル、ソケット、 :class:`array` 、および正規表現パターンのサポートを 追加しました. @@ -64,43 +73,64 @@ obj = Dict(red=1, green=2, blue=3) # このオブジェクトは弱参照可能 +.. impl-detail:: + + :class:`tuple` や :class:`long` など、他の組み込み型はサブクラス化しても + 弱参照をサポートしません。 + 拡張型は、簡単に弱参照をサポートできます。詳細について は、 :ref:`weakref-support` を参照してください。 .. class:: ref(object[, callback]) - *object* への弱参照を返します。リファレントがまだ生きているならば、元の オブジェクトは参照オブジェクトの呼び出しで取り出せす。 - リファレントがもはや生きていないならば、参照オブジェクトを呼び出したとき に :const:`None` を返します。 *callback* に - :const:`None` 以外の値を与えた場合、オブジェクトをまさに後始末処理しよう とするときに - 呼び出します。このとき弱参照オブジェクトは *callback* の唯一のパラメタと して渡されます。リファレントはもはや利用できません。 - - 同じオブジェクトに対してたくさんの弱参照を作れます。それぞれの弱参照に対 して登録されたコールバックは、 - もっとも新しく登録されたコールバックからもっとも古いものへと呼び出されま す。 + *object* への弱参照を返します。リファレントがまだ生きているならば、元の + オブジェクトは参照オブジェクトの呼び出しで取り出せす。 + リファレントがもはや生きていないならば、参照オブジェクトを呼び出したとき に + :const:`None` を返します。 *callback* に :const:`None` 以外の値を与えた 場合、 + オブジェクトをまさに後始末処理しようとするときに呼び出します。 + このとき弱参照オブジェクトは *callback* の唯一のパラメタとして渡されま す。 + リファレントはもはや利用できません。 + + 同じオブジェクトに対してたくさんの弱参照を作れます。それぞれの弱参照に対 して + 登録されたコールバックは、もっとも新しく登録されたコールバックからもっと も + 古いものへと呼び出されます。 コールバックが発生させた例外は標準エラー出力に書き込まれますが、伝播され ません。 - それらはオブジェクトの :meth:`__del__` メソッドが発生させる例外とまった く同様の方法で処理されます。 - - *object* がハッシュ可能(:term:`hashable`)ならば、弱参照はハッシュ可能で す。それらは *object* が - 削除された後でもそれらのハッシュ値を保持します。 *object* が削除されてか ら初めて - :func:`hash` が呼び出された場合に、その呼び出しは :exc:`TypeError` を発 生させます。 - - 弱参照は等価性のテストをサポートしていますが、順序をサポートしていませ ん。参照がまだ生きているならば、 *callback* に関係なく二つの参照はそれらの - リファレントと同じ等価関係を持ちます。リファレントのどちらか一方が削除さ れた場合、参照オブジェクトが同じオブジェクトである場合に限り、その参照は等価 です。 + それらはオブジェクトの :meth:`__del__` メソッドが発生させる例外と完全に 同じ方法で + 処理されます。 + + *object* がハッシュ可能(:term:`hashable`)ならば、弱参照はハッシュ可能で す。 + それらは *object* が削除された後でもそれらのハッシュ値を保持します。 + *object* が削除されてから初めて :func:`hash` が呼び出された場合に、その 呼び出しは + :exc:`TypeError` を発生させます。 + + 弱参照は等価性のテストをサポートしていますが、順序をサポートしていませ ん。 + 参照がまだ生きているならば、 *callback* に関係なく二つの参照はそれらの + リファレントと同じ等価関係を持ちます。リファレントのどちらか一方が削除さ れた場合、 + 参照オブジェクトが同一である場合に限り、その参照は等価です。 .. versionchanged:: 2.4 - 以前はファクトリでしたが、サブクラス化可能な型になりまし た。 :class:`object` 型から導出されています. + 以前はファクトリでしたが、サブクラス化可能な型になりました。 + :class:`object` 型から導出されています. .. function:: proxy(object[, callback]) - 弱参照を使う *object* へのプロキシを返します。弱参照オブジェクトとともに 用いられる明示的な参照外しを要求する代わりに、これはほとんどのコンテキストに - おけるプロキシの利用をサポートします。 *object* が呼び出し可能かどうかに 依存して、 - 返されるオブジェクトは ``ProxyType`` または ``CallableProxyType`` のどち らか一方の - 型を持ちます。プロキシオブジェクトはリファレントに関係なくハッシュ可能 (:term:`hashable`)ではありません。 + 弱参照を使う *object* へのプロキシを返します。 + 弱参照オブジェクトを明示的な参照外しをしながら利用する代わりに、多くの ケースで + プロキシを利用することができます。 + 返されるオブジェクトは、 *object* が呼び出し可能かどうかによって、 ``ProxyType`` + または ``CallableProxyType`` のどちらかの型を持ちます。 + プロキシオブジェクトはリファレントに関係なくハッシュ可能 (:term:`hashable`)ではありません。 これによって、それらの基本的な変更可能という性質による多くの問題を避けて います。 - そして、辞書のキーとしての利用を妨げます。 *callback* は :func:`ref` 関 数の同じ名前のパラメータと同じものです。 - + そして、辞書のキーとしての利用を妨げます。 + *callback* は :func:`ref` 関数の同じ名前のパラメータと同じものです。 + + .. note:: + + 訳注: リファレントが変更不能型であっても、プロキシはリファレントが消 えるという + 状態の変更があるために、変更可能型です。 .. function:: getweakrefcount(object) @@ -114,25 +144,20 @@ .. class:: WeakKeyDictionary([dict]) - キーを弱く参照するマッピングクラス。もはやキーへの強い参照がなくなったと きに、辞書のエントリは捨てられます。アプリケーションの他の部分が所有するオブ ジェクトへ - 属性を追加することもなく、それらのオブジェクトに追加データを関連づけるた めにこれを使うことができます。これは属性へのアクセスをオーバーライドするオブ ジェクトに + キーを弱参照するマッピングクラス。キーへの強参照がなくなったときに、 + 辞書のエントリは捨てられます。アプリケーションの他の部分が所有するオブジ ェクトへ + 属性を追加することもなく、それらのオブジェクトに追加データを関連づけるた めに + 使うことができます。これは属性へのアクセスをオーバーライドするオブジェク トに 特に便利です。 .. note:: - 注意: :class:`WeakKeyDictionary` は Python 辞書型の上に作られている ので、 + 警告: :class:`WeakKeyDictionary` は Python 辞書型の上に作られているの で、 反復処理を行うときにはサイズ変更してはなりませ ん。 :class:`WeakKeyDictionary` の場合、反復処理の最中にプログラムが行った操作が、(ガベージコレクショ ンの副作用として) 「魔法のように」辞書内の要素を消し去ってしまうため、確実なサイズ変更 は困難なのです。 -.. :class:`WeakKeyDictionary` objects have the following additional methods. These -.. expose the internal references directly. The references are not guaranteed to -.. be "live" at the time they are used, so the result of calling the references -.. needs to be checked before being used. This can be used to avoid creating -.. references that will cause the garbage collector to keep the keys around longer -.. than needed. - -:class:`WeakKeyDictionary` オブジェクトは、以下のメソッドを持ちます。 +:class:`WeakKeyDictionary` オブジェクトは、以下の追加のメソッドを持ちます。 これらのメソッドは、内部の参照を直接公開します。 その参照は、利用される時に生存しているとは限りません。 なので、参照を利用する前に、その参照をチェックする必要があります。 @@ -158,11 +183,12 @@ .. class:: WeakValueDictionary([dict]) - 値を弱く参照するマッピングクラス。値への強い参照がもはや存在しなくなった ときに、辞書のエントリは捨てられます。 + 値を弱参照するマッピングクラス。値への強参照が存在しなくなったときに、 + 辞書のエントリは捨てられます。 .. note:: - 注意: :class:`WeakValueDictionary` は Python 辞書型の上に作られてい るので、 + 警告: :class:`WeakValueDictionary` は Python 辞書型の上に作られている ので、 反復処理を行うときにはサイズ変更してはなりませ ん。 :class:`WeakKeyDictionary` の場合、反復処理の最中にプログラムが行った操作が、(ガベージコレクショ ンの副作用として) 「魔法のように」辞書内の要素を消し去ってしまうため、確実なサイズ変更 は困難なのです。 @@ -171,15 +197,15 @@ These method have the same issues as the :meth:`iterkeyrefs` and :meth:`keyrefs` methods of :class:`WeakKeyDictionary` objects. -:class:`WeakValueDictionary` オブジェクトは、以下のメソッドを持ちます。 +:class:`WeakValueDictionary` オブジェクトは、以下の追加のメソッドを持ちま す。 これらのメソッドは、 :class:`WeakKeyDictionary` クラス の :meth:`iterkeyrefs` -と :meth:`keyrefs` メソッドと同じ問題を持っています。 +と :meth:`keyrefs` メソッドと同じ目的を持っています。 .. method:: WeakValueDictionary.itervaluerefs() .. Return an :term:`iterator` that yields the weak references to the values. - 値への弱い参照を生成するイテレータ(:term:`iterator`)を返します。 + 値への弱参照を生成するイテレータ(:term:`iterator`)を返します。 .. versionadded:: 2.5 @@ -188,7 +214,7 @@ .. Return a list of weak references to the values. - 値への弱い参照のリストを返します。 + 値への弱参照のリストを返します。 .. versionadded:: 2.5 @@ -210,12 +236,14 @@ .. data:: ProxyTypes - プロキシのためのすべての型オブジェクトを含むシーケンス。これは両方のプロ キシ型の名前付けに依存しないで、オブジェクトがプロキシかどうかのテストをより 簡単にできます。 + プロキシのためのすべての型オブジェクトを含むシーケンス。 + これは両方のプロキシ型の名前付けに依存しないで、オブジェクトがプロキシか どうかのテストをより簡単にできます。 .. exception:: ReferenceError - プロキシオブジェクトが使われても、元のオブジェクトがガーベジコレクション されてしまっているときに発生する例外。これは標準の :exc:`ReferenceError` 例 外と同じです。 + プロキシオブジェクトが使われても、元のオブジェクトがガベージコレクション + されてしまっているときに発生する例外。これは標準 の :exc:`ReferenceError` 例外と同じです。 .. seealso:: @@ -229,7 +257,8 @@ 弱参照オブジェクト ------------------ -弱参照オブジェクトは属性あるいはメソッドを持ちません。しかし、リファレント がまだ存在するならば、呼び出すことでそのリファレントを取得できるようにしま す:: +弱参照オブジェクトは属性あるいはメソッドを持ちません。しかし、リファレント が +まだ存在するならば、呼び出すことでそのリファレントを取得できるようにしま す:: >>> import weakref >>> class Object: @@ -295,9 +324,11 @@ 例 -- -この簡単な例では、アプリケーションが以前に参照したオブジェクトを取り出すた めにオブジェクトIDを利用する方法を示します。 -オブジェクトに生きたままであることを強制することなく、オブジェクトのIDは他 のデータ構造の中で使えます。 -しかし、そうする場合は、オブジェクトはまだIDによって取り出せます。 +この簡単な例では、アプリケーションが以前に参照したオブジェクトを +取り出すためにオブジェクトIDを利用する方法を示します。 +オブジェクトに生きたままであることを強制することなく、オブジェクトの +IDを他のデータ構造の中で使うことができ、必要に応じてIDからオブジェクトを +取り出せます。 .. Example contributed by Tim Peters