В Python, как проверить, является ли объект объектом-генератором?
Пробую это -
>>> type(myobject, generator)
выдает ошибку -
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'generator' is not defined
(Я знаю, что могу проверить, есть ли у объекта next
метод для того, чтобы он был генератором, но мне нужен какой-то способ, с помощью которого я могу определить тип любого объекта, а не только генераторов.)
from types import GeneratorType;type(myobject, GeneratorType)
даст вам правильный результат для объектов класса «генератор». Но, как предполагает Дейнит, это не обязательно правильный путь.__next__
, вы фактически принимаете любой итератор, а не только генераторы - что весьма вероятно, что вы хотите.Ответы:
Вы можете использовать GeneratorType из типов:
источник
isinstance(gen, (types.GeneratorType, map, filter))
, полезно также обнаружитьmap
иfilter
. Это все еще не будет включать в себя другие итерации и итераторы, хотя.Вы имеете в виду функции генератора? использовать
inspect.isgeneratorfunction
.РЕДАКТИРОВАТЬ :
если вам нужен объект генератора, вы можете использовать inspect.isgenerator, как указал JAB в своем комментарии.
источник
inspect.isgenerator
.inspect.isgenerator
это только сокращенная на:isinstance(object, types.GeneratorType)
.Я думаю, что важно проводить различие между функциями генератора и генераторами (результат функции генератора):
Вызов generator_function не даст нормального результата, он даже не выполнит никакого кода в самой функции, результатом будет специальный объект, называемый generator :
так что это не функция генератора, а генератор:
и функция генератора не является генератором:
просто для справки, фактический вызов тела функции будет происходить при использовании генератора, например:
Смотрите также. В python есть ли способ проверить, является ли функция «генератором», прежде чем вызывать ее?
источник
inspect.isgenerator
Функция хорошо , если вы хотите , чтобы проверить наличие чистых генераторов (т.е. объекты из «генератора» класса). Однако он вернется,False
если вы проверите, например,izip
итерацию. Альтернативный способ проверки обобщенного генератора - использовать эту функцию:источник
x=iter([1,2])
. Мне кажется, это действительно проверка, является ли объект итератором , а не генератором. Но, возможно, «итератор» - это именно то, что вы подразумеваете под «обобщенным генератором».Вы можете использовать Итератор или, более конкретно, Генератор из модуля ввода .
результат:
источник
typing.TypeVar
класса, по-видимому, не поощряют использованиеisinstance
в сочетании сtyping
модулем: «Во время выполненияisinstance(x, T)
будет повышатьсяTypeError
. В общем,isinstance()
иissubclass()
не должно использоваться с типами».источник
Не делай этого. Это просто очень, очень плохая идея.
Вместо этого сделайте это:
В маловероятном случае, когда в теле цикла for также есть
TypeError
s, есть несколько вариантов: (1) определить функцию для ограничения объема ошибок или (2) использовать вложенный блок try .Или (3) что-то вроде этого, чтобы различать все эти,
TypeError
которые плавают вокруг.Или (4) исправьте другие части вашего приложения, чтобы обеспечить генераторы соответствующим образом. Это часто проще, чем все это.
источник
if
заявлений. И. Такая микрооптимизация - пустая трата времени. Исправьте алгоритм, который создает смешанный пакет итераторов и не итераторов, чтобы производить только итераторы и избавить себя от всей этой боли.Если вы используете веб-сервер Tornado или аналогичный, вы можете обнаружить, что методы сервера на самом деле являются генераторами, а не методами. Это затрудняет вызов других методов, так как yield не работает внутри метода, и поэтому вам нужно начать управлять пулами связанных объектов-генераторов. Простой способ управления пулами связанных генераторов состоит в создании вспомогательной функции, такой как
Теперь пишу цепочечные генераторы, такие как
Производит вывод
Это, вероятно, то, что вы хотите, если вы хотите использовать генераторы в качестве альтернативы потока или подобного.
источник
(Я знаю, что это старый пост.) Нет необходимости импортировать модуль, вы можете объявить объект для сравнения в начале программы:
источник