是否有内省生成器对象的技术(例如单元测试中的断言)?
更具体地说,我有一个数据处理管道,包含一系列小函数,通常在列表推导或生成器表达式中应用于值,如下所示:
生成一些随机数据:
>>> raw_data = ["${}".format(RND.randint(10, 100)) for c in range(10)]
>>> # a function that does some sort of of transform
>>> fnx = lambda q: float(q.replace('$', ''))
>>> d1 = [fnx(itm) for itm in raw_data]
在下一步中,将对 d1 的项目应用另一个转换函数,依此类推。
在上面的例子中,断言,例如, prices_clean 的长度,或其值的最小值/最大值等,是我的单元测试套件的核心:
>>> assert len(d1) == 10
鉴于我只是要迭代这些中间结果,我实际上并不需要列表,生成器对象会做,并且给出了更低的内存配置文件,这就是我使用的:
>>> d1 = (fnx(itm) for itm in raw_data)
当然,使用列表推导时依赖的断言不适用于生成器对象:
>>> d1
<generator object <genexpr> at 0x106da9230>
>>> assert len(d1) == 10
Traceback (most recent call last):
File "<pyshell#33>", line 1, in <module>
assert len(d1) == 10
TypeError: object of type 'generator' has no len()
如果我必须在生成器对象上调用 list()仅用于断言,那么我的测试套件运行速度非常慢(不幸的实际结果是debs通常根本不运行它)
我已经查看了生成器对象的属性,我可以有用地反省,但我没有看到我如何以我在这里描述的方式经常使用它们。
答案 0 :(得分:1)
正如@ thg435评论的那样,在不消耗它的情况下,你不知道发电机的长度。
通常我会做以下其中一项:
如果生成器产生少量元素:
assert len(list(d1)) == 10
或
assert sum(1 for x in d1) == 10
答案 1 :(得分:1)
Reference for Type checking of a Generator object
import types
self.assertIsInstance(_result_generator, types.GeneratorType)