有没有办法检查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)时,可能会在代码中稍后出现错误。
我宁愿在尝试创建生成器对象时抛出错误。
答案 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()
,依此类推。
以上解决方案是非常通用的概念,可用于在发电机启动之前检查东西 - 并且,除非进行一些非常强烈的内省,它应该可以用作大多数发电机的替代品事情可能是必要的。