>백엔드 개발 >파이썬 튜토리얼 >효율적인 키 처리 및 피클링을 위해 `dict` 하위 클래스를 어떻게 완성할 수 있나요?

효율적인 키 처리 및 피클링을 위해 `dict` 하위 클래스를 어떻게 완성할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-11-19 16:07:02340검색

How Can I Perfect My `dict` Subclass for Efficient Key Handling and Pickling?

완벽한 Dict 하위 클래스 재정의

소개

완벽한 사전 하위 클래스를 만들려면 핵심 뉘앙스, 피클링 효과 및 효율적인 메서드 재정의를 고려해야 합니다. . 이 문서에서는 이 목표를 달성하기 위한 포괄적인 접근 방식을 제공합니다.

우선 고려 사항

  • 키 처리: 소문자 키를 얻으려면 __getitem__ 및 __setitem__을 재정의하여 키를 변환하기 전에 dict에 액세스합니다. 가져오기를 활성화하려면 __setitem__을 재정의하여 키 강제 변환을 처리하세요.
  • 피클링: 예, dict를 서브클래싱하면 피클링에 영향을 미칠 수 있습니다. 호환성을 보장하려면 __setstate__, __getstate__ 및 __reduce__를 구현하세요.
  • 필수 메서드: 완전한 기능을 위해 __repr__, update 및 __init__와 같은 필수 메서드를 재정의하세요.

MutableMapping 사용

dict를 직접 서브클래싱하는 대신 collections.abc 모듈에서 MutableMapping 추상 기본 클래스(ABC)를 사용하는 것이 좋습니다. 필요한 메서드가 포함된 템플릿을 제공하고 구현 누락을 방지하는 데 도움이 됩니다.

코드 예

from collections.abc import MutableMapping

class TransformedDict(MutableMapping):
    def __init__(self, *args, **kwargs):
        self.store = dict()
        self.update(dict(*args, **kwargs))  # use the free update to set keys

    def __getitem__(self, key):
        return self.store[self._keytransform(key)]

    def __setitem__(self, key, value):
        self.store[self._keytransform(key)] = value

    def __delitem__(self, key):
        del self.store[self._keytransform(key)]

    def __iter__(self):
        return iter(self.store)

    def __len__(self):
        return len(self.store)

    def _keytransform(self, key):
        return key

class lcdict(TransformedDict):

    def _keytransform(self, key):
        return key.lower()

TransformedDict의 이 하위 클래스는 원하는 소문자 키 기능을 구현합니다.

s = lcdict([('Test', 'test')])

assert s.get('TEST') is s['test']
assert 'TeSt' in s

결론

dict 재정의 및 ABC 활용의 복잡성을 이해함으로써 "완벽한" dict 하위 클래스를 만들 수 있습니다. 이 접근 방식은 키 조작, 피클링 호환성 및 완전한 분석법 적용 범위를 보장하여 개발자에게 유연하고 강력한 데이터 구조를 제공합니다.

위 내용은 효율적인 키 처리 및 피클링을 위해 `dict` 하위 클래스를 어떻게 완성할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.