2012-09-18 46 views
2

产量返回collections.Iterable但许多类型也可迭代如何确定函数返回值是否是生成器?

def aaaa(): 
    yield 1 
    yield 2 
    yield 3 

d = aaaa() 

print(d,type(d),isinstance(d, collections.Iterable)) 

打印类型

<generator object aaaa at 0x0000000002626B88> <class 'generator'> True 

我没有找到类“发电机”或者我不能做类型检测。

+5

为什么你需要知道?迭代器和生成器的全部重点是你可以迭代它而不需要知道它是什么。 – BrenBarn

+1

类型检查是一种代码异味,避免。 – wim

+3

@BrenBarn:如果你需要迭代两次或更多的结果,你必须知道。你总是可以使用'itertools.tee',但这只是你可能只想为发电机支付的开销。即使所有用户中有99.9%不需要知道,总会有一些这样的问题是有趣的。 :-) – cfi

回答

10

如果你想检查迭代是一个生成器对象:

import types 
isinstance(aaaa(), types.GeneratorType) # ==> True 

如果你想检查功能包含yield语句(即功能是发电机):

import inspect 
inspect.isgeneratorfunction(aaaa) # ==> True 
7

看看检查模块,特别是inspect.isgeneratorfunction

这就是说,更有趣的问题是它是一个列表还是其他迭代。要回答这个问题,你可以检查是否定义了__getitem__

相关问题