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)
mou*_*uad 34
你的意思是发电机功能 用inspect.isgeneratorfunction
.
编辑:
如果你想要一个生成器对象,可以使用jab在他的评论中指出的inspect.isgenerator.
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)
不需要导入模块,可以在程序开头声明一个对象进行比较:
gentyp = type(1 for i in "")
# ...
type(myobject) == gentyp
Run Code Online (Sandbox Code Playgroud)
您可以使用 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)