GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

mewwts

addict – Python Dictは、ヘロインより優れています

投稿日:

Python Dictは、ヘロインより優れています。

addict – ヘロインより優れているPython Dict。

addictはPythonモジュールで、標準の項目構文に加えて属性を使って値を取得したり設定したりすることができます。

つまり、これ以上のような辞書書く必要はありません。

body = {
    'query': {
        'filtered': {
            'query': {
                'match': {'description': 'addictive'}
            },
            'filter': {
                'term': {'created_by': 'Mats'}
            }
        }
    }
}

代わりに、次の3行を書くことができます:

body = Dict()
body.query.filtered.query.match.description = 'addictive'
body.query.filtered.filter.term.created_by = 'Mats'

インストール

あなたはpip経由でインストールできます

pip install addict

またはcondaを通じて

conda install addict -c conda-forge

AddictはPython 2とPython 3で動作し、すべてのビルドは2.7,3.6、および3.7にテストされています。

使用法

中毒者はdictから継承しますが、その値にアクセスして設定する点でより柔軟です。 辞書を使って作業することは今や喜びです! ネストされたDictの項目を設定することはです:

>>> from addict import Dict
>>> mapping = Dict()
>>> mapping.a.b.c.d.e = 2
>>> mapping
{'a': {'b': {'c': {'d': {'e': 2}}}}}

Dictが反復可能な値でインスタンス化されている場合、これらの値を反復して複製し、 Dictます。 したがって、以下の作品

>>> mapping = {'a': [{'b': 3}, {'b': 3}]}
>>> dictionary = Dict(mapping)
>>> dictionary.a[0].b
3

mapping['a']はもはやdictionary['a']と同じ参照ではありません。

>>> mapping['a'] is dictionary['a']
False

この動作はコンストラクタに限定され、項目が属性または項目の構文を使用して設定されても参照は変更されません。

>>> a = Dict()
>>> b = [1, 2, 3]
>>> a.b = b
>>> a.b is b
True

心に留めておくこと

intは有効な属性名ではないので、文字列ではないdictのキーはget / setitem構文で設定/取得する必要があります

>>> addicted = Dict()
>>> addicted.a.b.c.d.e = 2
>>> addicted[2] = [1, 2, 3]
{2: [1, 2, 3], 'a': {'b': {'c': {'d': {'e': 2}}}}}

ただし、2つの構文を自由に組み合わせてください。

>>> addicted.a.b['c'].d.e
2

キー、アイテムなどの属性

中毒者はdictにネイティブな属性を上書きさせないので、以下は動作しません

>>> mapping = Dict()
>>> mapping.keys = 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "addict/addict.py", line 53, in __setattr__
    raise AttributeError("'Dict' object attribute '%s' is read-only" % name)
AttributeError: 'Dict' object attribute 'keys' is read-only

しかし、以下は問題ありません

>>> a = Dict()
>>> a['keys'] = 2
>>> a
{'keys': 2}
>>> a['keys']
2

ちょうど普通のdictように。 どのキーを使用できるかについての制限はありません。

dictへの再帰的なフォールバック

中毒者を他のモジュールに安全に運ぶことができない場合は、 to_dict()使用して、中毒辞書の通常のdictクローンを返します。

>>> regular_dict = my_addict.to_dict()
>>> regular_dict.a = 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'a'

これは、ネストされたDictをいくつかの行に作成し、それを別のモジュールに配布する場合に最適です。

body = Dict()
body.query.filtered.query.match.description = 'addictive'
body.query.filtered.filter.term.created_by = 'Mats'
third_party_module.search(query=body.to_dict())

カウント

深くネストされた属性に簡単にアクセスして変更するDictの能力は、それをカウントするのに理想的です。 これにより、複数のレベルで簡単にカウントできるようになります。

このデータを考えてみましょう:

data = [
    {'born': 1980, 'gender': 'M', 'eyes': 'green'},
    {'born': 1980, 'gender': 'F', 'eyes': 'green'},
    {'born': 1980, 'gender': 'M', 'eyes': 'blue'},
    {'born': 1980, 'gender': 'M', 'eyes': 'green'},
    {'born': 1980, 'gender': 'M', 'eyes': 'green'},
    {'born': 1980, 'gender': 'F', 'eyes': 'blue'},
    {'born': 1981, 'gender': 'M', 'eyes': 'blue'},
    {'born': 1981, 'gender': 'F', 'eyes': 'green'},
    {'born': 1981, 'gender': 'M', 'eyes': 'blue'},
    {'born': 1981, 'gender': 'F', 'eyes': 'blue'},
    {'born': 1981, 'gender': 'M', 'eyes': 'green'},
    {'born': 1981, 'gender': 'F', 'eyes': 'blue'}
]

あなたのeyes目で男女のgenderborn人の数を数えたい場合は、この情報を簡単に計算できます:

counter = Dict()

for row in data:
    born = row['born']
    gender = row['gender']
    eyes = row['eyes']

    counter[born][gender][eyes] += 1

print(counter)
{1980: {'M': {'blue': 1, 'green': 3}, 'F': {'blue': 1, 'green': 1}}, 1981: {'M': {'blue': 2, 'green': 1}, 'F': {'blue': 2, 'green': 1}}}

更新

addictの更新機能は、便宜上通常のdictから変更されています。 dictを使用してネストされたアイテムを更新すると、それを上書きします:

>>> d = {'a': {'b': 3}}
>>> d.update({'a': {'c': 4}})
>>> print(d)
{'a': {'c': 4}}

addictは再帰し、ネストされたDict実際に更新します。

>>> D = Dict({'a': {'b': 3}})
>>> D.update({'a': {'c': 4}})
>>> print(D)
{'a': {'b': 3, 'c': 4}}

これはいつ特に有用ですか?

このモジュールは、PythonでのElasticsearchクエリの作成が非常に面倒です。 複数の行にまたがってdictを書くことができたら、必ずしもそうする必要はありません。 代わりに中毒者を使用してください。

特典

それはdictであるため、JSONに完全にシリアライズし、to_dict()メソッドを使用すると、どこでも中毒を安全に運ぶことができます。

テスト、開発、CI

問題とプルリクエストは大歓迎です。 機能やバグに関するディスカッションを開始する、または既存のものに簡単に返信するための問題を自由に開くことができます。 プルリクエストについては、周囲のコードスタイルに触れていただければ幸いです。そのため、筆記テストが重要です。 プルリクエストとコミットは、TravisCIとcoverallsに対して自動的に実行されます。

単体テストはtest_addict.pyファイルに実装され、 test_addict.py pythonフレームワークを使用します。 テストの実行はかなり簡単です。

python -m unittest -v test_addict

# - or -
python test_addict.py

お客様の声

@spiritsack – 「神の母、これはすべてを変える」

ハッカー・ニュースの誰か – 「…目的自体は大したものではない」







-mewwts
-, , , ,

執筆者: