4

Python で PERL のような autovivication が必要だとします。つまり、次のようになります。

>>> d = Autovivifier()
>>> d = ['nested']['key']['value']=10
>>> d
{'nested': {'key': {'value': 10}}}

これを行う主な方法がいくつかあります。

  1. 再帰的なデフォルト dict を使用する
  2. __missing__フックを使用してネストされた構造を返す

OK -- 簡単です。

ここで、キーが欠落している dict からデフォルト値を返したいとします。繰り返しますが、それを行ういくつかの方法:

  1. ネストされていないパスの場合、フックを使用できます__missing__
  2. 欠落している可能性のあるキー パスへのアクセスをラップする try/except ブロック
  3. 使用します{}.get(key, default) (ネストされた dict では簡単に機能しません)。つまり、次のバージョンはありません。autoviv.get(['nested']['key']['no key of this value'], default)

2 つの目標は、相容れない対立のように見えます (私がこの数時間、これを解決しようとしたことに基づいています)。

質問は次のとおりです。

1) のネストされた構造を作成する Autovivifying dict が必要だとしd['arbitrary']['nested']['path']ます。AND 2) try/except でラップせずに、存在しない任意のネストからデフォルト値を返しますか?

問題は次のとおりです。

  1. の呼び出しはd['nested']['key']['no key of this value'] と同等 (d['nested'])['key']['no key of this value']です。オーバーライドは、 ALSO__getitem__オーバーライドするオブジェクトを返さないと機能しません__getitem__
  2. そのパスの存在をテストすると、Autovivifier を作成するための両方の方法で dict エントリが作成されます。if d['p1']['sp2']['etc.']つまり、でテストするだけなら、そのパス全体を作成したくありませんif

Python で次のような dict を提供するにはどうすればよいですか。

  1. d['p1']['p2'][etc]=valタイプ(Autovivication)のアクセス パスを作成します。
  2. 存在をテストする場合は、同じパスを作成しないでください。
  3. {}.get(key, default)try/except でラップせずにデフォルト値 ( など) を返す
  4. dict 操作の完全なセットは必要ありません。本当に唯一d=['nested']['key']['value']=valでありd['nested']['key']['no key of this value']、デフォルト値と同じです。テストd['nested']['key']['no key of this value']で作成しないことをお勧めしますが、それを受け入れます。

?

4

3 に答える 3

4

辞書の再帰ツリーを作成するにはdefaultdict、次のトリックを使用します。

from collections import defaultdict

tree = lambda: defaultdict(tree)

次に、で x を作成できますx = tree()

上記 @BrenBarn から -- defaultdict の defaultdict、ネスト

于 2014-06-30T04:25:38.193 に答える
1

Python のディクショナリ プロトコルと正確に一致するわけではありませんが、可変の getitem 引数を使用する独自の自動有効化ディクショナリを実装することで、妥当な結果を得ることができます。(2.x) のようなもの:

class ExampleVivifier(object):
    """ Small example class to show how to use varargs in __getitem__. """

    def __getitem__(self, *args):
        print args

使用例は次のとおりです。

>>> v = ExampleVivifier()
>>> v["nested", "dictionary", "path"]
(('nested', 'dictionary', 'path'),)

空欄を埋めて、ここで目的の動作を実現する方法を確認できます。

于 2014-06-30T13:57:45.687 に答える