Estoy trabajando en un problema que implica la validación de un formato desde un parche diff unificado.¿Cuál es una buena manera de decorar un iterador para alterar el valor antes de llamar al siguiente en python?
Las variables dentro del formato interno pueden abarcar varias líneas a la vez, así que escribí un generador que extrae cada línea y produce la variable cuando se completa.
Para evitar tener que volver a escribir esta función al leer desde un archivo diff unificado, creé un generador para quitar los caracteres unificados de la línea antes de pasarlo al validador de formato interno. Sin embargo, me estoy estancando en un ciclo infinito (tanto en el código como en mi cabeza). Me he abstraído del problema al siguiente código. Estoy seguro de que hay una mejor manera de hacer esto. Simplemente no sé qué es.
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)
¿Alguna idea de una forma mejor y más piadosa de hacer esto?
Creo que el último ejemplo es lo que estoy buscando. –