Как исправить выход из генераторов, чтобы избежать StopIteration до последнего элемента в списке? - PullRequest
0 голосов
/ 29 декабря 2018

Значения моего словаря исчерпываются до полного истощения значений словаря в генераторах.Я не совсем уверен, что является причиной этого, но я думаю, что я каким-то образом исчерпываю сам словарь, если это возможно?

Я пробовал несколько опций и настраивал операторы next внутри функции termince_generator,где эта функциональность работает безупречно.

class SentenceGenerator(object):
    """Class element for rule based sentence generator"""

def __init__(self, rules_string):
    self.rules_dict = dict()
    lines = rules_string.split("\n")
    for line in lines:
        if not line.strip():
            pass
        rule_name, *rule = line.split("=")
        if rule:
            self.rules_dict[rule_name.strip()] = self.generator([x.strip() for x in rule[0].split('|')])

def generator(self, array):
    i = -1
    while True:
        i = (i + 1) % len(array)
        yield array[i]

def sentence_generator(self, syntax):
    if syntax:
        for w in syntax.split():
            if w in self.rules_dict:
                yield next(self.rules_dict[w])
    else:
        yield ""

if __name__ == "__main__":
   rules = """
   noun = dog | carrot | John | tomato | pumpkin
   target = dog | cattor | John | tomato | pumpkin
   verb = eats | kicks | shares | wants | dislikes
   adjective = pretty | sad | frustrated | sweet | yours
   targetadjective = pretty | sad | frustrated | sweet | yours
   sentence = noun verb target .
   beautifulsentence = adjective noun verb targetadjective target .
   twosentences = sentence sentence
   """

   g = SentenceGenerator(rules)
   gg = g.sentence_generator("noun")
   print(next(gg))
   print(next(gg))
   print(next(gg))

Ожидаемый результат будет таким, что при использовании print(next(gg)) словарь существительного будет зациклен.Цикл не имеет конца благодаря функции генератора.

Но фактический результат просто дает мне dog и затем сообщает StopIteration, что указывает на то, что значения словаря исчерпаны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...