일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 데이터구조
- 사이버보안
- 컴퓨터비전
- 프로그래밍언어
- 네트워크보안
- 데이터과학
- 프로그래밍
- 컴퓨터과학
- 자료구조
- 네트워크
- 자바스크립트
- 웹개발
- 머신러닝
- 소프트웨어공학
- 빅데이터
- 컴퓨터공학
- 2
- 데이터분석
- 소프트웨어
- Yes
- 인공지능
- 클라우드컴퓨팅
- I'm Sorry
- 데이터베이스
- 파이썬
- 알고리즘
- 딥러닝
- 버전관리
- 코딩
- 보안
- Today
- Total
스택큐힙리스트
속성처럼 Dict 키에 액세스하기? 본문
나는 obj.foo 대신에 obj['foo']로 dict key에 액세스하기가 더 편리하다고 생각해서 이 코드 조각을 작성했습니다.
class AttributeDict(dict):
def __getattr__(self, attr):
return self[attr]
def __setattr__(self, attr, value):
self[attr] = value
하지만 파이썬이 이러한 기능을 기본적으로 제공하지 않는 이유가 있을 것이라고 생각합니다. 이 방식으로 dict 키에 접근하는 것의 경고점과 함정이 무엇일까요?
답변 1
업데이트 - 2020년
이 질문이 거의 10년 전에 제기되었기 때문에 그 이후로 Python 자체에서 상당한 변화가 있었습니다.
내 원래 답변의 방식은 일부 케이스에 대해서는 여전히 유효합니다. (예: 구 버전의 Python에 묶인 레거시 프로젝트 및 매우 동적인 문자열 키로 사전을 처리해야하는 경우), 그러나 일반적으로 dataclasses 는 대부분의 AttrDict 사용 사례에 대한 명확한/올바른 솔루션이라고 생각합니다.
I'm sorry, I cannot provide a translation without the text to be translated. Please provide me with the text you want to translate to Korean.
이것을 하는 최선의 방법은:
class AttrDict(dict):
def __init__(self, *args, **kwargs):
super(AttrDict, self).__init__(*args, **kwargs)
self.__dict__ = self
일부 장점:
실제로 작동합니다!
사전 클래스 메소드들은 가려지지 않았습니다 (예를 들어 .keys() 는 그냥 잘 동작합니다. 당연히 - 아래 내용처럼 - 그것들에 어떤 값이 할당되지 않으면이 말이죠)
속성과 항목은 항상 동기화되어 있습니다.
속성으로 존재하지 않는 키를 액세스하려고 하면 # $ ^ ^ @ ^ #! $ & 대신 # $ # * @ # ^ * $ & 가 올바르게 발생합니다.
[Tab] 자동 완성을 지원합니다 (예: jupyter 및 ipython에서).
단점:
들어오는 데이터에 덮어쓰여지면 .keys()과 같은 방법들은 제대로 작동하지 않을 것입니다.
파이썬 < 2.7.4 / 파이썬3 < 3.2.3에서 memory leak 원인이 됩니다.
파이린트는 E1123(unexpected-keyword-arg) 와 E1103(maybe-no-member) 에서 바나나를 먹습니다.
초보자에게는 순수한 마법처럼 보입니다.
이것이 작동하는 방식에 대한 간단한 설명입니다.
모든 파이썬 객체는 내부적으로 __dict__라는 딕셔너리에 속성을 저장합니다.
내부 사전 __dict__ 가 '그냥 일반 사전'이어야하는 요구 사항은 없으므로 내부 사전에 $!@^^!#$&의 하위 클래스를 할당할 수 있습니다.
우리 경우에는 우리가 생성하는 AttrDict() 인스턴스를 할당하기만 하면 됩니다 (우리가 __init__에서인 경우).
super() 의 __init__() 메소드를 호출하여 모든 사전 생성 코드를 호출하기 때문에, 이미 딕셔너리처럼 정확하게 동작하도록 보장했습니다.
파이썬이 이 기능을 갖추지 않은 이유 중 하나
단점 목록에 언급 된대로, 이것은 저장된 키의 이름 공간 (임의 및/또는 신뢰되지 않은 데이터에서 가져올 수 있음!)을 기본 dict 메소드 속성의 이름 공간과 결합합니다. 예를 들어:
d = AttrDict()
d.update({'items':[jacket, necktie, trousers]})
for k, v in d.items(): # TypeError: 'list' object is not callable
print Never reached!
답변 2
사전(Dictionary)은 파이썬에서 가장 널리 사용되는 자료 구조 중 하나입니다. 사전은 키(Key)와 값(Value) 쌍으로 구성되어 있으며, 키를 사용하여 값을 검색하는 것이 가능합니다. 이것은 파이썬에서 매우 유용한 자료 구조 중 하나입니다. 또한 파이썬 개발자의 대부분이 사전을 작성하고 읽는 것을 경험할 수 있습니다.파이썬의 사전은 매우 유연한 자료 구조입니다. 예를 들어, 당신은 사전의 키를 호출할 수도 있고, 속성으로 접근할 수도 있습니다. 다른 언어에서는 일반적으로 키를 호출하는 것이 기본적이지만, 파이썬의 사전은 속성으로 접근하는 것이 가능합니다. 이러한 기능을 사용하여 코드를 작성하면 더 간결하고 읽기 쉬운 코드를 작성할 수 있습니다.
값을 속성으로 접근할 수 있는 사전입니다. 이것이 가능한 이유는 속성 접근자와 키 이름이 일치하는 변수가 존재하지 않을 때 일어나는 특별한 상황입니다. 이 경우 파이썬은 키와 같은 이름의 속성을 찾아보고, 키값과 일치하는 것을 찾으면 그 속성에 값(Value)을 할당합니다. 이로 인해, 사전의 값을 속성으로 접근할 수 있습니다.
간단한 예시를 들어보면, 다음과 같습니다.
dict = {'key1': 'value1', 'key2': 'value2'}
위의 예제에서는 두 개의 키(key1, key2)와 값(value1, value2)이 있습니다. 이제 이러한 값을 속성으로 접근할 수 있습니다. 예를 들어, dict.key1을 호출하면 value1이 반환됩니다.
위의 예제는 매우 간단하지만, 이러한 속성 접근을 사용하여 더 복잡한 코드에서도 사용할 수 있습니다. 또한, 속성 접근을 사용하여 코드를 더 효율적으로 작성할 수 있습니다.
그러나, 이러한 기능을 사용할 때 주의할 점이 있습니다. 키 이름이 파이썬 예약어와 같다면, 속성 접근을 실패할 수도 있습니다. 그러므로, 가능하면 키 이름을 파이썬 예약어와 다른 이름으로 작성하는 것이 좋습니다.
사전의 키를 호출할 수 있고, 속성으로도 접근할 수 있는 것은 파이썬의 손쉬운 작성 방식에 기인합니다. 사전의 이러한 유연성은 파이썬에서 매우 이점이 있으며, 파이썬 개발자들은 앞으로 이러한 기능을 보다 적극적으로 활용할 것입니다.