1. ホーム
  2. python

[解決済み] ネストされたPythonのdictをオブジェクトに変換する?

2022-03-16 14:25:54

質問

ネストされたdictやリストに対して、属性アクセスを使ってデータを取得するエレガントな方法を探しています(つまり、javascriptスタイルのオブジェクト構文です)。

例えば

>>> d = {'a': 1, 'b': {'c': 2}, 'd': ["hi", {'foo': "bar"}]}

このようにアクセスできるようにする必要があります。

>>> x = dict2obj(d)
>>> x.a
1
>>> x.b.c
2
>>> x.d[1].foo
bar

再帰性がないと無理だと思うのですが、ディクスのオブジェクト・スタイルを得るにはどうしたらいいでしょうか?

どのように解決するのですか?

更新してください。 Python 2.6 以降のバージョンでは namedtuple のデータ構造は、あなたのニーズに合っています。

>>> from collections import namedtuple
>>> MyStruct = namedtuple('MyStruct', 'a b d')
>>> s = MyStruct(a=1, b={'c': 2}, d=['hi'])
>>> s
MyStruct(a=1, b={'c': 2}, d=['hi'])
>>> s.a
1
>>> s.b
{'c': 2}
>>> s.c
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'MyStruct' object has no attribute 'c'
>>> s.d
['hi']

代替案(本来の回答内容)は

class Struct:
    def __init__(self, **entries):
        self.__dict__.update(entries)

次に

>>> args = {'a': 1, 'b': 2}
>>> s = Struct(**args)
>>> s
<__main__.Struct instance at 0x01D6A738>
>>> s.a
1
>>> s.b
2