如何检查一个对象是否是Python中的生成器对象?

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

尝试这个 –

>>> type(myobject, generator) 

给出了错误 –

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

(我知道我可以检查对象是否有next方法,它是一个生成器,但我想用某种方式来确定任何对象的types,而不仅仅是生成器。)

你可以使用types的GeneratorType:

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

你是指发电机function? 使用inspect.isgeneratorfunction

编辑:

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

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

 >>> 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> 

所以它不是发电机function,而是发电机:

 >>> inspect.isgeneratorfunction(generator) False >>> import types >>> isinstance(generator, types.GeneratorType) True 

而发电机function不是发电机:

 >>> isinstance(generator_function, types.GeneratorType) False 

仅供参考,实际的函数体调用将由消费函数生成,例如:

 >>> list(generator) [1, 2] 

另请参见在python中有一种方法来检查函数是否是一个“生成器函数”之前调用它?

如果你想检查纯生成器(即类“生成器”的对象), inspect.isgenerator函数没问题。 但是,如果你检查一个izip迭代器,它将返回False 。 检查广义发生器的另一种方法是使用这个函数:

 def isgenerator(iterable): return hasattr(iterable,'__iter__') and not hasattr(iterable,'__len__') 
 >>> import inspect >>> >>> def foo(): ... yield 'foo' ... >>> print inspect.isgeneratorfunction(foo) True 

我知道我可以检查对象是否有一个下一个方法,它是一个生成器,但我想用某种方式,我可以确定任何对象的types,而不仅仅是生成器。

不要这样做。 这只是一个非常非常糟糕的主意。

相反,这样做:

 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循环的主体也有TypeError ,有几种select:(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)修复应用程序的其他部分以适当地提供生成器。 这通常比所有这些都简单。

如果你使用龙卷风web服务器或类似的,你可能已经发现,服务器方法实际上是发电机,而不是方法。 这使得调用其他方法变得困难,因为yield在方法内部不起作用,因此您需要开始pipe理链式生成器对象池。 pipe理链式生成器池的简单方法是创build一个帮助函数,如

 def chainPool(*arg): for f in arg: if(hasattr(f,"__iter__")): for e in f: yield e else: yield f 

现在写链式发生器如

 [x for x in chainPool(chainPool(1,2),3,4,chainPool(5,chainPool(6)))] 

产生输出

 [1, 2, 3, 4, 5, 6] 

这可能是你想要的,如果你想使用发电机作为一个线程的替代或类似的。