2015-10-12 3 views
1

Я новичок в концепции Python 3.Переопределение метода, который дает

Базовый класс имеет следующие функции:

class DocumentFormatter(object): 
    def transform_element(self, key, value): 
     if isinstance(value, list): 
      for li, lv in enumerate(value): 
       for inner_k, inner_v in self.transform_element(
         "%s.%s" % (key, li), lv): 
        yield inner_k, inner_v 
     elif isinstance(value, dict): 
      formatted = self.format_document(value) 
      for doc_key in formatted: 
       yield "%s.%s" % (key, doc_key), formatted[doc_key] 
     else: 
      # We assume that transform_value will return a 'flat' value, 
      # not a list or dict 
      yield key, self.transform_value(value) 

    def format_document(self, document): 
     def flatten(doc, path): 
      top_level = (len(path) == 0) 
      if not top_level: 
       path_string = ".".join(path) 
      for k in doc: 
       v = doc[k] 
       if isinstance(v, dict): 
        path.append(k) 
        for inner_k, inner_v in flatten(v, path): 
         yield inner_k, inner_v 
        path.pop() 
       else: 
        transformed = self.transform_element(k, v) 
        for new_k, new_v in transformed: 
         if top_level: 
          yield new_k, new_v 
         else: 
          yield "%s.%s" % (path_string, new_k), new_v 
     return dict(flatten(document, [])) 

В производном классе, я только хочу, чтобы немного изменить функции transform_element:

def transform_element(self, key, value): 
    if key=="cats": 
     yield key, self.transform_value(value) 
    else: 
     yield super().transform_element(key,value) 

Если ключ «кошки», Я хочу использовать свою логику. Кроме того, я хочу, чтобы реализация базового класса работала. Должен ли я назвать доходность или я должен назвать возвращение?

+0

питона 2 или Python 3? – khelwood

+3

Использовать 'yield from' для получения от другого генератора –

ответ

2

вы должны перебрать переопределенный метод и дать каждому его элементу, иначе вы получите генератор генератора, который вам не нужен.

Таким образом, ваш метод должен выглядеть следующим образом:

def transform_element(self, key, value): 
    if key=="cats": 
     yield key, self.transform_value(value) 
    else: 
     for item in super().transform_element(key,value): 
      yield item 
+1

Или вы можете сказать' yield from super(). Transform_element (key, value) ' –

Смежные вопросы