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