Python生成器中的参数检查

时间:2014-08-18 21:22:35

标签: python arguments generator

有没有办法检查Python生成器中的参数并引发Exception而不是返回生成器对象?

例如考虑以下函数:

def find_files(directory, pattern="*"):
    if not os.path.isdir(directory):
        raise ValueError("Invalid directory: " + directory)
    for root, _, files in os.walk(directory):
        for basename in files:
            if fnmatch.fnmatch(basename, pattern):
                yield os.path.join(root, basename)

创建生成器对象时,

g = find_files('/non/existent/path')

即使路径'/ non / existent / path'不存在,也不会引发异常。但是,当使用生成器(迭代通过g)时,可能会在代码中稍后出现错误。

我宁愿在尝试创建生成器对象时抛出错误。

1 个答案:

答案 0 :(得分:3)

我知道的唯一好方法是将(非检查)生成器包装在执行检查的函数中:

def _find_files(directory, pattern):
    for root, _, files in os.walk(directory):
        for basename in files:
            if fnmatch.fnmatch(basename, pattern):
                yield os.path.join(root, basename)

def find_files(directory, pattern="*"):
    if not os.path.isdir(directory):
        raise ValueError("Invalid directory: " + directory)
    return _find_files(directory, pattern)

原因是生成器(根据定义)在调用next(python3.x中的__next__)方法之前不会执行任何操作。此时,它会执行第一个yield之前的所有代码,然后停止执行,直到下一次调用.next(),依此类推。

以上解决方案是非常通用的概念,可用于在发电机启动之前检查东西 - 并且,除非进行一些非常强烈的内省,它应该可以用作大多数发电机的替代品事情可能是必要的。