Bir biçimi birleşik diff düzeltme eki içinden doğrulamayı içeren bir sorun üzerinde çalışıyorum.Bir iteratörün python'da sonraki değerini değiştirmek için dekore etmenin iyi bir yolu nedir?
İç biçimdeki değişkenler, bir seferde birden çok satıra yayılabilir, bu yüzden her satırı çeken ve tamamlandığında değişkeni veren bir jeneratör yazdım.
Birleşik bir diff dosyasından okurken bu işlevi yeniden yazmak zorunda kalmamak için, birleştirilmiş farklı karakterleri satırdan iç format doğrulayıcıya geçirmeden önce kesmek için bir jeneratör oluşturdum. Ancak, sonsuz bir döngüde (hem kodda hem de kafamda) sıkışıp kalıyorum. Aşağıdaki kodla ilgili problemi özetledim. Eminim bunu yapmanın daha iyi bir yolu vardır. Sadece ne olduğunu bilmiyorum.
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)
Bunu yapmak için daha iyi, daha pythonik bir yolla ilgili herhangi bir fikir var mı? onun next()
yöntem vatansız olması nedeniyle
class DecoratedGenerator(Iterable):
def __iter__(self):
# Using iterable from closure
for outer_item in iterable:
self.outer_info = outer_item[0]
inner_item = outer_item[1:]
yield inner_item
Orijinal versiyon sonlandırıldı asla ve aynı değerini oldu her zaman döneceğini:
Son örnekte aradığım şey bence. –