【发布时间】:2014-03-13 19:58:29
【问题描述】:
给定一个生成器对象,是否可以测试它是否由给定的生成器创建?也许更好的说法是,是否可以测试我们拥有的生成器的“类型”?由于生成器对象的类型为generator,因此使用type 或isinstance 进行测试将不起作用。
考虑下面的代码:
>>> def gen1():
... yield 1
...
>>> def gen2():
... yield 2
...
>>> g1 = gen1()
>>> g2 = gen2()
>>>
>>> def do_something(f):
... # need to know if f is a gen1 generator or a gen2 generator here
... # isinstance(f, gen1) raises a TypeError since gen1 is not a type
... # type(f) is gen1 returns false
... print(f)
...
>>> do_something(g1)
<generator object gen1 at 0x100dcb370>
>>> do_something(g2)
<generator object gen2 at 0x100dcb3c0>
请注意,如果我使用迭代器类来实现生成器,那么type 和isinstance 都可以工作,因为生成的对象将是迭代器类给定的类型:
>>> class gen():
... def __next__(self):
... return 1
...
>>> f = gen()
>>> type(f) is gen
True
>>> isinstance(f, gen)
True
是否可以通过使用yield 创建的生成器以简单的方式实现相同的功能(例如,无需将生成器包装在类中或使用装饰器)?
【问题讨论】:
标签: python