티스토리 뷰

반응형

Stack Overflow에 자주 검색, 등록되는 문제들과 제가 개발 중 찾아 본 문제들 중에서 나중에도 찾아 볼 것 같은 문제들을 정리하고 있습니다.

Stack Overflow에서 가장 먼저 확인하게 되는 가장 높은 점수를 받은 Solution과 현 시점에 도움이 될 수 있는 가장 최근에 업데이트(최소 점수 확보)된 Solution을 각각 정리하였습니다.

 

아래 word cloud를 통해 이번 포스팅의 주요 키워드를 미리 확인하세요.

How to convert a nested Python dict to object?

중첩된 Python dict를 객체로 변환하는 방법은 무엇인가요?

 문제 내용 

I'm searching for an elegant way to get data using attribute access on a dict with some nested dicts and lists (i.e. javascript-style object syntax).

저는 중첩된 dict와 list가 있는 dict에 대해 attribute 접근을 통해 데이터를 가져오는 방법(즉, javascript-style object 문법)을 찾고 있습니다.

 

For example:

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

 

Should be accessible in this way:

아래와 같이 접근할 수 있어야 합니다:
>>> x = dict2obj(d)
>>> x.a
1
>>> x.b.c
2
>>> x.d[1].foo
bar

 

I think, this is not possible without recursion, but what would be a nice way to get an object style for dicts?

제 생각에 이는 재귀 없이는 불가능하지만 dict를 객체 스타일로 얻는 좋은 방법이 무엇인가요?

 

 

 높은 점수를 받은 Solution 

Update: In Python 2.6 and onwards, consider whether the namedtuple data structure suits your needs:

업데이트: 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']

 

The alternative (original answer contents) is:

대안(원래 답변 내용)은 다음과 같습니다.
class Struct:
    def __init__(self, **entries):
        self.__dict__.update(entries)

 

Then, you can use:

그런 다음 다음을 사용할 수 있습니다.
>>> args = {'a': 1, 'b': 2}
>>> s = Struct(**args)
>>> s
<__main__.Struct instance at 0x01D6A738>
>>> s.a
1
>>> s.b
2

 

 

 가장 최근 달린 Solution 

In 2021, use pydantic BaseModel - will convert nested dicts and nested json objects to python objects and vice versa:

2021년에는 pydantic BaseModel을 사용하여 중첩된 dict와 중첩된 json 객체를 python 객체로 변환하고 그 반대로 할 수 있습니다:

 

https://pydantic-docs.helpmanual.io/usage/models/

>>> class Foo(BaseModel):
...     count: int
...     size: float = None
... 
>>> 
>>> class Bar(BaseModel):
...     apple = 'x'
...     banana = 'y'
... 
>>> 
>>> class Spam(BaseModel):
...     foo: Foo
...     bars: List[Bar]
... 
>>> 
>>> m = Spam(foo={'count': 4}, bars=[{'apple': 'x1'}, {'apple': 'x2'}])

 

Object to dict

객체를 dict로 변환
>>> print(m.dict())
{'foo': {'count': 4, 'size': None}, 'bars': [{'apple': 'x1', 'banana': 'y'}, {'apple': 'x2', 'banana': 'y'}]}

 

Object to JSON

객체를 JSON으로 변환
>>> print(m.json())
{"foo": {"count": 4, "size": null}, "bars": [{"apple": "x1", "banana": "y"}, {"apple": "x2", "banana": "y"}]}

 

Dict to object

dict를 객체로 변환
>>> spam = Spam.parse_obj({'foo': {'count': 4, 'size': None}, 'bars': [{'apple': 'x1', 'banana': 'y'}, {'apple': 'x2', 'banana': 'y2'}]})
>>> spam
Spam(foo=Foo(count=4, size=None), bars=[Bar(apple='x1', banana='y'), Bar(apple='x2', banana='y2')])

 

JSON to object

JSON을 객체로 변환
>>> spam = Spam.parse_raw('{"foo": {"count": 4, "size": null}, "bars": [{"apple": "x1", "banana": "y"}, {"apple": "x2", "banana": "y"}]}')
>>> spam
Spam(foo=Foo(count=4, size=None), bars=[Bar(apple='x1', banana='y'), Bar(apple='x2', banana='y')])

 

 

출처 : https://stackoverflow.com/questions/1305532/how-to-convert-a-nested-python-dict-to-object

반응형
댓글
공지사항
최근에 올라온 글