12 Sept 2014

如何检测一个参数是Generator类型?

收藏到CSDN网摘


遇到一个问题,需要检测输入参数类型,如果是list,tuple,dict,set等内置类型,可以很容易使用isinstance(arg,list)这样的函数来测试,但是如果输入参数是generator呢?例如foo(abs(i) for i in range(-10, 10)),这时如何检测?



如果可以使用import,那么解决办法是使用types模块内的类型来判断:
import types
isinstance(gen, types.GeneratorType)

如果明确不能使用import,那么就需要考虑其他办法了,下面的代码是一个"丑陋"的解决办法:
hasattr(arg,'__iter__') and not hasattr(arg,'__len__')

而在checkio上正好有类似的一道题目,要求自己实现min/max函数,但是不能使用import等内置函数,其中有一个测试用例就需要判断generator类型.

No comments :

Post a Comment