Сделал Вы консультируетесь со следующими журналами:
/var/log/pm-powersave.log
/var/log/syslog
/var/log/dmesg
?
Вы видите полезную информацию в каком-либо из них?
, Что происходит, если Вы выполняете эту команду:
sudo bash -x /usr/lib/pm-utils/power.d/wireless true
?
Не напрямую. Часть гибкости, которая позволяет использовать генераторы для реализации совместных подпрограмм, управления ресурсами и т. Д., Заключается в том, что они всегда одноразовые. После запуска генератор не может быть повторно запущен. Вам нужно будет создать новый объект-генератор.
Однако вы можете создать свой собственный класс, который переопределяет __ 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)
Думаю, ответ на этот вопрос - «Нет». Возможно я ошибаюсь. Может случиться так, что с некоторыми забавными новыми вещами, которые вы можете делать с генераторами в 2.6, включая аргументы и обработку исключений, которые позволят сделать что-то вроде того, что вы хотите. Но эти функции в основном предназначены для реализации полунепрерывных действий.
Почему вы не хотите иметь свои собственные классы или декораторы? И почему вы хотели создать декоратор, который возвращал бы генератор вместо экземпляра класса?
Если вы напишете много таких строк, то ответ Джона Милликина будет самым чистым.
Но если вы не возражаете, добавив 3 строки и несколько отступов, вы сможете сделать это без специального декоратора. Это сочиняет 2 трюка:
. [Обычно полезно:] Можно легко сделать класс итерабельным без реализации
.next()
- просто используйте генератор для __iter__(self)
!
Вместо того, чтобы возиться с конструктором, можно определить одноразовый класс внутри функции.
=>
def myxrange(n):
class Iterable(object):
def __iter__(self):
i = 0
while i < n:
yield i
i += 1
return Iterable()
Мелкий шрифт: Я не тестировал производительность, порождение таких классов может быть расточительным. Но потрясающе ;-)
.