Как сделать повторяющийся генератор в Python

Сделал Вы консультируетесь со следующими журналами:

/var/log/pm-powersave.log
/var/log/syslog
/var/log/dmesg

?

Вы видите полезную информацию в каком-либо из них?

, Что происходит, если Вы выполняете эту команду:

sudo bash -x /usr/lib/pm-utils/power.d/wireless true

?

20
задан Community 23 May 2017 в 12:13
поделиться

3 ответа

Не напрямую. Часть гибкости, которая позволяет использовать генераторы для реализации совместных подпрограмм, управления ресурсами и т. Д., Заключается в том, что они всегда одноразовые. После запуска генератор не может быть повторно запущен. Вам нужно будет создать новый объект-генератор.

Однако вы можете создать свой собственный класс, который переопределяет __ iter __ () . Он будет действовать как многоразовый генератор:

def multigen(gen_func):
    class _multigen(object):
        def __init__(self, *args, **kwargs):
            self.__args = args
            self.__kwargs = kwargs
        def __iter__(self):
            return gen_func(*self.__args, **self.__kwargs)
    return _multigen

@multigen
def myxrange(n):
   i = 0
   while i < n:
     yield i
     i += 1
m = myxrange(5)
print list(m)
print list(m)
17
ответ дан 30 November 2019 в 01:08
поделиться

Думаю, ответ на этот вопрос - «Нет». Возможно я ошибаюсь. Может случиться так, что с некоторыми забавными новыми вещами, которые вы можете делать с генераторами в 2.6, включая аргументы и обработку исключений, которые позволят сделать что-то вроде того, что вы хотите. Но эти функции в основном предназначены для реализации полунепрерывных действий.

Почему вы не хотите иметь свои собственные классы или декораторы? И почему вы хотели создать декоратор, который возвращал бы генератор вместо экземпляра класса?

0
ответ дан 30 November 2019 в 01:08
поделиться

Если вы напишете много таких строк, то ответ Джона Милликина будет самым чистым.

Но если вы не возражаете, добавив 3 строки и несколько отступов, вы сможете сделать это без специального декоратора. Это сочиняет 2 трюка:

.
  1. [Обычно полезно:] Можно легко сделать класс итерабельным без реализации .next() - просто используйте генератор для __iter__(self)!

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

=>

def myxrange(n):
    class Iterable(object):
        def __iter__(self):
            i = 0
            while i < n:
                yield i
                i += 1
    return Iterable()

Мелкий шрифт: Я не тестировал производительность, порождение таких классов может быть расточительным. Но потрясающе ;-)

.
1
ответ дан 30 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

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