是否有一种方法可以检查Python生成器中的参数并引发异常,而不是返回生成器对象?
例如,请考虑以下功能:
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) (这可能是在代码中很晚的时间)时,会抛出一个错误。
我希望在尝试创建生成器对象时引发错误。
发布于 2014-08-18 21:27:12
我所知道的唯一好方法是将(非检查)生成器封装在一个函数中进行检查:
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 (__next__ in python3.x)方法之前,生成器(根据定义)不会执行任何操作。此时,它将执行直到第一个yield的所有代码,然后停止执行,直到下一次调用.next(),以此类推。
上面的解决方案是相当普遍的概念,可以用来在发电机启动之前检查一些东西--除了一些非常强烈的内省之外,它应该可以作为替代大多数发电机的一种方法,在可能需要这类东西的地方。
https://stackoverflow.com/questions/25372248
复制相似问题