В Python реализован генератор на основе генератора, который разбивает строку на строки в виде кортежей (тип токена, значение токена) :
for token in scan("a(b)"):
print token
будет печатать
("literal", "a")
("l_paren", "(")
...
Следующая задача подразумевает разбор потока токенов, и для этого мне нужно иметь возможность посмотреть на один элемент вперед от текущего без перемещения указателя вперед. Тот факт, что итераторы и генераторы не предоставляют полную последовательность элементов одновременно, но каждый элемент по мере необходимости делает предпросмотр немного сложнее, чем списки, поскольку следующий элемент неизвестен, если не вызывается __next__()
.
Как может выглядеть прямая реализация прогнозирующего генератора на основе генератора? В настоящее время я использую обходной путь, который подразумевает создание списка из генератора:
token_list = [token for token in scan(string)]
Тогда упростить задачу можно следующим образом:
try:
next_token = token_list[index + 1]
except: IndexError:
next_token = None
Конечно, это просто отлично работает. Но обдумывая этот вопрос, у меня возникает второй вопрос: есть ли смысл создавать scan()
генератор в первую очередь?