Какой хороший способ d Как создать итератор для изменения значения перед вызовом следующего в python?

Я работаю над проблемой, которая включает проверку формата из единого патча различий.

Переменные внутри внутренний формат может охватывать несколько строк одновременно, поэтому я написал генератор, который извлекает каждую строку и возвращает переменную, когда она завершена.

Чтобы избежать необходимости переписывать эту функцию при чтении из унифицированного файла сравнения, я создал генератор, чтобы удалить унифицированные символы различий из строки перед передачей во внутренний валидатор формата. Однако я застреваю в бесконечном цикле (как в коде, так и в голове). Я отвлекся от проблемы на следующий код. Я уверен, что есть способ сделать это лучше. Я просто не знаю, что это такое.

from collections import Iterable

def inner_format_validator(inner_item):
    # Do some validation to inner items
    return inner_item[0] != '+'

def inner_gen(iterable):
    for inner_item in iterable:
        # Operates only on inner_info type data
        yield inner_format_validator(inner_item)

def outer_gen(iterable):
    class DecoratedGenerator(Iterable):
        def __iter__(self):
            return self
        def next(self):
            # Using iterable from closure
            for outer_item in iterable:
                self.outer_info = outer_item[0]
                inner_item = outer_item[1:]
                return inner_item
    decorated_gen = DecoratedGenerator()
    for inner_item in inner_gen(decorated_gen):
        yield inner_item, decorated_gen.outer_info

if __name__ == '__main__':    
    def wrap(string):
        # The point here is that I don't know what the first character will be
        pseudo_rand = len(string)
        if pseudo_rand * pseudo_rand % 2 == 0:
            return '+' + string
        else:
            return '-' + string

    inner_items = ["whatever"] * 3
    # wrap screws up inner_format_validator
    outer_items = [wrap("whatever")] * 3
    # I need to be able to
    # iterate over inner_items
    for inner_info in inner_gen(inner_items):
        print(inner_info)
    # and iterate over outer_items
    for outer_info, inner_info in outer_gen(outer_items):
        # This is an infinite loop
        print(outer_info)
        print(inner_info)

Есть идеи, как лучше, более питонно это сделать?

5
задан Jeff May 13 June 2011 в 23:59
поделиться