Как я знаю, пуст ли генератор от запуска?

Одной из возможных причин может быть объявление var console где-то в вашем скрипте.

Использовать:

window.console.log(...);

. Работал для меня.

Надеюсь, это поможет

127
задан Dan 19 March 2009 в 09:51
поделиться

6 ответов

Простой ответ на Ваш вопрос: нет, нет никакого простого пути. Существует большое обходные решения.

действительно не должно быть простым путем, из-за того, каковы генераторы: способ произвести последовательность значений , не содержа последовательность в памяти . Таким образом, нет никакого обратного обхода.

Вы могли записать функцию has_next или возможно даже хлопнуть ее на генераторе как метод с необычным декоратором, если бы Вы хотели.

49
ответ дан David Berger 5 November 2019 в 07:20
поделиться

Я очень не хочу предложить второе решение, особенно то, которое я не использовал бы сам, но, если бы Вы абсолютно имели , чтобы сделать это и не использовать генератор, как в других ответах:

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)

Теперь мне действительно не нравится это решение, потому что я полагаю, что это не то, как должны использоваться генераторы.

8
ответ дан Ali Afshar 5 November 2019 в 07:20
поделиться
>>> 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')
1
ответ дан SilentGhost 5 November 2019 в 07:20
поделиться

Извините за очевидный подход, но лучший способ должен был бы сделать:

for item in my_generator:
     print item

Теперь Вы обнаружили, что генератор пуст при использовании его. Конечно, объект никогда не будет отображаться, если генератор будет пуст.

Это не может точно согласоваться с Вашим кодом, но это - то, для чего идиома генератора: итерация, поэтому возможно, Вы могли бы изменить свой подход немного или не использовать генераторы вообще.

3
ответ дан Ali Afshar 5 November 2019 в 07:20
поделиться

Лучший подход, по моему скромному мнению, должен был бы избежать специального теста. Большинство раз использование генератора тест:

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!"
9
ответ дан vezult 5 November 2019 в 07:20
поделиться

Предложение:

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.
88
ответ дан Eric Drechsel 5 November 2019 в 07:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: