2017-12-20 10 views
2

dict의 하위 클래스를 문자열 키에서 임의 유형의 값으로 매핑합니다. 키가 정규 표현식이면 별도로 저장되고 쿼리됩니다. 이 클래스는 (I 상속을 사용해야하는 이유입니다) 다른 라이브러리에 의해 사용되므로Python 상속 : 오버라이드되지 않은 메소드가 호출 될 때 오류 발생

class RegexDict(dict): 
    def __init__(self): 
     super().__init__() # non-regex keys in the parent class 
     self.regex_dict = {} # regex keys in the child class 

    def __getitem__(self, key): 
     try: 
      return super().__getitem__(key) 
     except KeyError: 
      for x in self.regex_dict: 
       if re.fullmatch(x, key): 
        return self.regex_dict[x] 
     raise KeyError(key) 

    def __setitem__(self, key, value): 
     key, is_regex = key 
     if is_regex: 
      self.regex_dict[key] = value 
     else: 
      super().__setitem__(key, value) 

, 나는 기본 클래스에서 비 오버라이드 (override) 메소드가 호출 될 때 오류가 발생합니다 있는지 확인하려면. 어떻게해야합니까?

답변

0

당신은 대신 DICT의 collections.abc.MutableMapping에서 상속해야합니다.

자동으로 간격을 채우고 구현해야하는 항목을 알려줍니다.

__getitem____setitem__ 외에도 __delitem__, __iter____len_를 구현해야합니다. 합리적으로 구현할 수없는 경우 예를 들어 NotImplementedError (클래스 사용을 많이 제한하더라도).

이것은 내부적으로 __getitem____setitem__ (구현 한 것) 만 필요한 모든 dict 메소드가 즉시 사용할 수 있다는 장점이 있습니다.

+0

슬프게도, 나의 경험에서 상속 * MutableMapping * 많은 팬더, 심지어 주류처럼 * 팬더 * 충분하지 않습니다. 또한, 상자 밖에서 작업하는 방법은 OP 요구 사항과 반대되는 것으로 보입니다. – pacholik

+0

이것은 실제로 이상적인 경우이지만 클래스를'pandas '로 작업하게 만들 필요가 있습니다. 내부적으로'pandas'는'np.dtype()'을 호출합니다. 이것은 불행하게도 커스텀 타입과 호환되지 않습니다. –

-1

하위 클래스를 지정하지 마십시오. 오브젝트가 dict이라는 타사 라이브러리를 설득하려면 __class__ 속성을 설정하십시오.

class RegexDict(): 
    __class__ = dict 

    def __init__(self): 
     self.non_regex_dict = {} 
     self.regex_dict = {} 

    def __getitem__(self, key): 
     try: 
      return self.non_regex_dict[key] 
     except KeyError: 
      for x in self.regex_dict: 
       if re.fullmatch(x, key): 
        return self.regex_dict[x] 
     raise KeyError(key) 

    def __setitem__(self, key, value): 
     key, is_regex = key 
     if is_regex: 
      self.regex_dict[key] = value 
     else: 
      self.non_regex_dict[key] = value 

rd = RegexDict() 
print(isinstance(rd, dict)) 
rd.clear() 

출력 :

True 
Traceback (most recent call last): 
    File "libo.py", line 30, in <module> 
    rd.clear() 
AttributeError: 'RegexDict' object has no attribute 'clear' 
+0

이 솔루션은 내 컴퓨터의 '팬더'에서 작동하지 않았습니다. 'pandas'가'RegexDict' 인스턴스로'np.dtype()'을 호출했을 때 실패했습니다. 왜 이것이 작동하지 않지만 상속에 관심이 있지만 Numpy 소스 코드에서'np.dtype()'을 찾을 수 없었습니다. –

+0

@LiboYin 예제를 제공해 주시겠습니까? 질문을 수정하십시오. – pacholik