티스토리 뷰
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
'개발 > 파이썬' 카테고리의 다른 글
리스트 내포 vs. 람다 + 필터 (0) | 2022.12.25 |
---|---|
다른 파일에서 변수 가져오기 (0) | 2022.12.24 |
딕셔너리 키 이름 변경하기 (0) | 2022.12.24 |
Cython: "fatal error: numpy/arrayobject.h: No such file or directory" 오류 수정하기 (0) | 2022.12.23 |
여러 CSV 파일을 판다스로 가져와 하나의 데이터프레임으로 만들기 (0) | 2022.12.23 |