Код на основании ниже основан на this recipe. Однако ключевой момент рецепта - то, что он дает возможность вырваться из итерации на итераторе, если итератор пуст, не работает здесь, вместо этого ведет себя следующим образом:Тестирование пустого итератора в Python for ... loop
- Если get_yes_no_answer() == False и есть два или более элементов, оставшихся в итераторе, next_choice пропускается, а не выбирается на следующей итерации.
- Если get_yes_no_answer() == Ложные и есть менее двух элементов, оставшихся в итератора, my_func() возвращает None.
Как я могу гарантировать, что:
- If get_yes_no_answer() == Ложные и есть два или более элементы остались в итераторе, next_choice является не пропустила?
- Если get_yes_no_answer() == Ложные и есть один элемент остается в итератора, my_func() печатает его и называет get_yes_no_answer()?
- Если get_yes_no_answer() == Ложных и там не остались в итераторе пунктов, то кроме 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)
Бинго! Я был рядом, но не сигары. Спасибо :) – sampablokuper
Второе решение, которое вы предложили, мне не очень нравится. Важно различать отсутствие совпадений и отсутствие выбора. Но спасибо. – sampablokuper