如何检查一个对象是否为Python中的生成器对象?
在Python中,我该如何检查一个对象是否是生成器对象呢?
我尝试了
>>> type(myobject, generator)
但是出现了错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'generator' is not defined
(我知道可以通过检查这个对象是否有一个__next__
方法来判断它是否是生成器,但我想要一种方法,可以用来判断任何对象的类型,而不仅仅是生成器。)
10 个回答
45
我觉得区分生成器函数和生成器(生成器函数的结果)是很重要的:
>>> def generator_function():
... yield 1
... yield 2
...
>>> import inspect
>>> inspect.isgeneratorfunction(generator_function)
True
调用生成器函数不会得到普通的结果,甚至不会执行函数内部的任何代码,返回的结果是一个特殊的对象,叫做生成器:
>>> generator = generator_function()
>>> generator
<generator object generator_function at 0x10b3f2b90>
所以这不是生成器函数,而是生成器:
>>> inspect.isgeneratorfunction(generator)
False
>>> import types
>>> isinstance(generator, types.GeneratorType)
True
而生成器函数也不是生成器:
>>> isinstance(generator_function, types.GeneratorType)
False
为了参考,实际执行函数内部的代码是通过消耗生成器来实现的,例如:
>>> list(generator)
[1, 2]
51
你是说生成器函数吗?可以使用 inspect.isgeneratorfunction
来检查。
补充:
如果你想要一个生成器对象,可以使用 inspect.isgenerator,正如JAB在他的评论中提到的。
309
你可以使用来自 types
模块的 GeneratorType
:
>>> import types
>>> types.GeneratorType
<class 'generator'>
>>> gen = (i for i in range(10))
>>> isinstance(gen, types.GeneratorType)
True