Приведенный ниже код основан на этом рецепте. Однако ключевой момент рецепта - то, что он предоставляет способ прервать итерацию на итераторе, если итератор пуст, - похоже, здесь не работает, вместо этого он ведет себя следующим нежелательным образом:
- Если get_yes_no_answer () == False и в итераторе осталось два или более элемента, next_choice пропускается, а не выбирается на следующей итерации.
- Если get_yes_no_answer () == False и в итераторе осталось менее двух элементов, my_func () возвращает None.
Как я могу убедиться, что:
- Если get_yes_no_answer () == False и в итераторе осталось два или более элемента, next_choice не пропускается?
- Если get_yes_no_answer () == False и в итераторе остался один элемент, my_func () печатает его и вызывает get_yes_no_answer ()?
- Если get_yes_no_answer () == False и в итераторе не осталось элементов, срабатывает предложение кроме StopIteration?
Вот код:
def my_func(choice_pattern, input):
# Search in input for some things to choose from.
choice_iterator = choice_pattern.finditer(input, re.M)
if not choice_iterator:
print "No choices. Exiting..."
sys.exit()
else:
# Show choices to the user. For each one, ask user for a yes/no response. If
# choice accepted, return a result. Otherwise show user next choice. If no
# choices accepted by user, quit.
for choice in choice_iterator:
print choice.group()
# get_yes_no_answer() returns True or False depending on user response.
if get_yes_no_answer():
return choice
else:
# Check if iterator is empty. If so, quit; if not, do something else.
try:
next_choice = choice_iterator.next()
except StopIteration:
print "No matches. Exiting..."
sys.exit()
else:
choice_iterator = itertools.chain([next_choice], choice_iterator)