如何在python中检查对象是否是生成器对象?

Pus*_*ade 137 python generator

在python中,如何检查对象是否是生成器对象?

试试这个 -

>>> type(myobject, generator)
Run Code Online (Sandbox Code Playgroud)

给出错误 -

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'generator' is not defined
Run Code Online (Sandbox Code Playgroud)

(我知道我可以检查对象是否有一个next方法让它成为一个生成器,但我想用一些方法来确定任何对象的类型,而不仅仅是生成器.)

utd*_*mir 200

您可以从类型中使用GeneratorType:

>>> import types
>>> types.GeneratorType
<class 'generator'>
>>> gen = (i for i in range(10))
>>> isinstance(gen, types.GeneratorType)
True
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这不适用于生成器类(例如,映射或过滤器对象)。 (2认同)

mou*_*uad 34

你的意思是发电机功能 用inspect.isgeneratorfunction.

编辑:

如果你想要一个生成器对象,可以使用jab在他的评论中指出的inspect.isgenerator.

  • @Piotr:在这种情况下你使用[`inspect.isgenerator`](http://docs.python.org/library/inspect.html#inspect.isgenerator). (5认同)
  • 注意:如果你只需要这个测试,你可以通过使用 [**@utdemir** 解决方案](http://stackoverflow.com/a/6416585/248390) 来避免一个小的开销,因为 `inspect.isgenerator` 只是一个简写为:[`isinstance(object, types.GeneratorType)`](https://hg.python.org/cpython/file/44590c1b264e/Lib/inspect.py#l164)。 (2认同)

Rob*_*ujo 17

我认为区分生成器函数生成器(生成器函数的结果)很重要:

>>> def generator_function():
...     yield 1
...     yield 2
...
>>> import inspect
>>> inspect.isgeneratorfunction(generator_function)
True
Run Code Online (Sandbox Code Playgroud)

调用generator_function不会产生正常结果,它甚至不会在函数本身中执行任何代码,结果将是名为generator的特殊对象:

>>> generator = generator_function()
>>> generator
<generator object generator_function at 0x10b3f2b90>
Run Code Online (Sandbox Code Playgroud)

所以它不是发电机功能,而是发电机:

>>> inspect.isgeneratorfunction(generator)
False

>>> import types
>>> isinstance(generator, types.GeneratorType)
True
Run Code Online (Sandbox Code Playgroud)

和发电机功能不是发电机:

>>> isinstance(generator_function, types.GeneratorType)
False
Run Code Online (Sandbox Code Playgroud)

仅供参考,功能体的实际调用将通过消耗生成器来实现,例如:

>>> list(generator)
[1, 2]
Run Code Online (Sandbox Code Playgroud)

另请参阅在python中有一种方法可以在调用之前检查函数是否是"生成器函数"?


Luc*_*lla 11

inspect.isgenerator如果要检查纯生成器(即"生成器"类的对象),则该函数很好.但是,False如果您检查,例如,izip可迭代,它将返回.检查通用生成器的另一种方法是使用此函数:

def isgenerator(iterable):
    return hasattr(iterable,'__iter__') and not hasattr(iterable,'__len__')
Run Code Online (Sandbox Code Playgroud)


kan*_*tal 7

不需要导入模块,可以在程序开头声明一个对象进行比较:

gentyp = type(1 for i in "")
# ...
type(myobject) == gentyp
Run Code Online (Sandbox Code Playgroud)


use*_*332 6

您可以使用 Iterator 或更具体地说,使用来自Typing模块的 Generator 。

from typing import Generator, Iterator
g = (i for i in range(1_000_000))
print(type(g))
print(isinstance(g, Generator))
print(isinstance(g, Iterator))
Run Code Online (Sandbox Code Playgroud)

结果:

<class 'generator'>
True
True
Run Code Online (Sandbox Code Playgroud)

  • +1 表示可行的解决方案。话虽这么说,“typing.TypeVar”类的文档似乎不鼓励将“isinstance”与“typing”模块结合使用:“在运行时,“isinstance(x, T)”将引发“TypeError”。一般来说,‘isinstance()’和‘issubclass()’不应该与类型一起使用。” (4认同)