我们的库之一中的生成器返回函数(即其中包含yield语句的函数)由于未处理的StopIteration异常而导致某些测试失败。为了方便起见,在这篇文章中我将此函数称为buggy。
我一直无法找到一种方法来buggy防止异常(不影响函数的正常运行)。同样,我还没有找到一种方法来捕获异常(使用try/ except)buggy。
(客户端代码usingbuggy可以捕获此异常,但这发生得太晚了,因为具有正确处理导致此异常的条件所需信息的代码是函数buggy。)
我正在使用的实际代码和测试用例太复杂,无法在此处发布,因此我创建了一个非常简单但又极其人为的玩具示例来说明问题。
一、模块功能buggy:
# mymod.py
import csv # essential!
def buggy(csvfile):
with open(csvfile) as stream:
reader = csv.reader(stream)
# how to test *here* if either stream is at its end?
for row in reader:
yield row
正如注释所示,csv模块(来自 Python 3.x 标准库)的使用是这个问题1的一个基本特征。
该示例的下一个文件是一个脚本,旨在代表“客户端代码”。换句话说,除了这个例子之外,这个脚本的“真正目的”在很大程度上是无关紧要的。它在示例中的作用是提供一种简单、可靠的方法来引出函数的问题buggy。(例如,它的一些代码可以重新用于测试套件中的测试用例。)
#!/usr/bin/env python3
# myscript.py
import sys
import mymod
def print_row(row):
print(*row, sep='\t')
def main(csvfile, mode=None):
if mode == 'first':
print_row(next(mymod.buggy(csvfile)))
else:
for row in mymod.buggy(csvfile):
print_row(row)
if __name__ == '__main__':
main(*sys.argv[1:])
该脚本将 CSV 文件的路径作为强制参数,以及可选的第二个参数。如果省略第二个参数,或者它不是字符串"first",则脚本将以TSVstdout格式打印到CSV 文件中的信息。如果第二个参数是字符串,则仅打印第一行中的信息。"first"
当使用空文件和字符串作为参数2StopIteration调用脚本时,会出现我试图捕获的异常。myscript.py"first"
MMTTMM
喵喵时光机
相关分类