Одной из возможных причин может быть объявление var console
где-то в вашем скрипте.
Использовать:
window.console.log(...);
. Работал для меня.
Надеюсь, это поможет
Простой ответ на Ваш вопрос: нет, нет никакого простого пути. Существует большое обходные решения.
действительно не должно быть простым путем, из-за того, каковы генераторы: способ произвести последовательность значений , не содержа последовательность в памяти . Таким образом, нет никакого обратного обхода.
Вы могли записать функцию has_next или возможно даже хлопнуть ее на генераторе как метод с необычным декоратором, если бы Вы хотели.
Я очень не хочу предложить второе решение, особенно то, которое я не использовал бы сам, но, если бы Вы абсолютно имели , чтобы сделать это и не использовать генератор, как в других ответах:
def do_something_with_item(item):
print item
empty_marker = object()
try:
first_item = my_generator.next()
except StopIteration:
print 'The generator was empty'
first_item = empty_marker
if first_item is not empty_marker:
do_something_with_item(first_item)
for item in my_generator:
do_something_with_item(item)
Теперь мне действительно не нравится это решение, потому что я полагаю, что это не то, как должны использоваться генераторы.
>>> gen = (i for i in [])
>>> next(gen)
Traceback (most recent call last):
File "<pyshell#43>", line 1, in <module>
next(gen)
StopIteration
В конце генератора StopIteration
повышен, с тех пор в Вашем конце случая сразу достигнут, исключение повышено. , Но обычно Вы не должны проверять на существование следующего значения.
другая вещь, которую можно сделать:
>>> gen = (i for i in [])
>>> if not list(gen):
print('empty generator')
Извините за очевидный подход, но лучший способ должен был бы сделать:
for item in my_generator:
print item
Теперь Вы обнаружили, что генератор пуст при использовании его. Конечно, объект никогда не будет отображаться, если генератор будет пуст.
Это не может точно согласоваться с Вашим кодом, но это - то, для чего идиома генератора: итерация, поэтому возможно, Вы могли бы изменить свой подход немного или не использовать генераторы вообще.
Лучший подход, по моему скромному мнению, должен был бы избежать специального теста. Большинство раз использование генератора тест:
thing_generated = False
# Nothing is lost here. if nothing is generated,
# the for block is not executed. Often, that's the only check
# you need to do. This can be done in the course of doing
# the work you wanted to do anyway on the generated output.
for thing in my_generator():
thing_generated = True
do_work(thing)
, Если это не достаточно хорошо, можно все еще выполнить явный тест. На данном этапе thing
будет содержать последнее сгенерированное значение. Если ничто не было сгенерировано, это будет не определено - если Вы уже не определили переменную. Вы могли проверить значение thing
, но это немного ненадежно. Вместо этого просто установите флаг в блоке и проверьте его позже:
if not thing_generated:
print "Avast, ye scurvy dog!"
Предложение:
def peek(iterable):
try:
first = next(iterable)
except StopIteration:
return None
return first, itertools.chain([first], iterable)
Использование:
res = peek(mysequence)
if res is None:
# sequence is empty. Do stuff.
else:
first, mysequence = res
# Do something with first, maybe?
# Then iterate over the sequence:
for element in mysequence:
# etc.