在python中,如何检查对象是否为生成器对象?
试着——
>>> type(myobject, generator)
给出错误-
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'generator' is not defined
(我知道我可以检查对象是否有下一个方法为它是一个生成器,但我想要一些方法使用,我可以确定任何对象的类型,而不仅仅是生成器。)
我认为区分生成器函数和生成器(生成器函数的结果)是很重要的:
>>> def generator_function():
... yield 1
... yield 2
...
>>> import inspect
>>> inspect.isgeneratorfunction(generator_function)
True
调用generator_function不会产生正常的结果,它甚至不会在函数本身执行任何代码,结果将是一个名为generator的特殊对象:
>>> generator = generator_function()
>>> generator
<generator object generator_function at 0x10b3f2b90>
所以它不是generator函数,而是generator:
>>> inspect.isgeneratorfunction(generator)
False
>>> import types
>>> isinstance(generator, types.GeneratorType)
True
generator函数不是generator:
>>> isinstance(generator_function, types.GeneratorType)
False
仅供参考,实际调用函数体将通过消耗生成器发生,例如:
>>> list(generator)
[1, 2]
在python中,是否有一种方法可以在调用函数之前检查它是否为“生成器函数”?
我知道我可以检查对象是否有下一个方法,它是一个生成器,但我想用一些方法,我可以确定任何对象的类型,而不仅仅是生成器。
不要这样做。这是个非常非常糟糕的主意。
相反,这样做:
try:
# Attempt to see if you have an iterable object.
for i in some_thing_which_may_be_a_generator:
# The real work on `i`
except TypeError:
# some_thing_which_may_be_a_generator isn't actually a generator
# do something else
在不太可能发生的情况下,for循环体也有TypeErrors,有几个选择:(1)定义一个函数来限制错误的范围,或者(2)使用嵌套的try块。
或者(3)类似这样的东西来区分所有这些浮动的typeerror。
try:
# Attempt to see if you have an iterable object.
# In the case of a generator or iterator iter simply
# returns the value it was passed.
iterator = iter(some_thing_which_may_be_a_generator)
except TypeError:
# some_thing_which_may_be_a_generator isn't actually a generator
# do something else
else:
for i in iterator:
# the real work on `i`
或者(4)修复应用程序的其他部分,以适当地提供生成器。这通常比这些都简单。