Python で PERL のような autovivication が必要だとします。つまり、次のようになります。
>>> d = Autovivifier()
>>> d = ['nested']['key']['value']=10
>>> d
{'nested': {'key': {'value': 10}}}
これを行う主な方法がいくつかあります。
OK -- 簡単です。
ここで、キーが欠落している dict からデフォルト値を返したいとします。繰り返しますが、それを行ういくつかの方法:
- ネストされていないパスの場合、フックを使用できます
__missing__
- 欠落している可能性のあるキー パスへのアクセスをラップする try/except ブロック
- 使用します
{}.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 でラップせずに、存在しない任意のネストからデフォルト値を返しますか?
問題は次のとおりです。
- の呼び出しは
d['nested']['key']['no key of this value']
と同等(d['nested'])['key']['no key of this value']
です。オーバーライドは、 ALSO__getitem__
オーバーライドするオブジェクトを返さないと機能しません__getitem__
。 - そのパスの存在をテストすると、Autovivifier を作成するための両方の方法で dict エントリが作成されます。
if d['p1']['sp2']['etc.']
つまり、でテストするだけなら、そのパス全体を作成したくありませんif
。
Python で次のような dict を提供するにはどうすればよいですか。
d['p1']['p2'][etc]=val
タイプ(Autovivication)のアクセス パスを作成します。- 存在をテストする場合は、同じパスを作成しないでください。
{}.get(key, default)
try/except でラップせずにデフォルト値 ( など) を返す- dict 操作の完全なセットは必要ありません。本当に唯一
d=['nested']['key']['value']=val
でありd['nested']['key']['no key of this value']
、デフォルト値と同じです。テストd['nested']['key']['no key of this value']
で作成しないことをお勧めしますが、それを受け入れます。