首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python生成器中的参数检查

Python生成器中的参数检查
EN

Stack Overflow用户
提问于 2014-08-18 21:22:34
回答 1查看 245关注 0票数 2

是否有一种方法可以检查Python生成器中的参数并引发异常,而不是返回生成器对象?

例如,请考虑以下功能:

代码语言:javascript
运行
复制
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)

在创建生成器对象时,

代码语言:javascript
运行
复制
g = find_files('/non/existent/path')

即使路径'/non/existent/ path‘不存在,也不会引发异常。但是,当使用生成器(遍历g) (这可能是在代码中很晚的时间)时,会抛出一个错误。

我希望在尝试创建生成器对象时引发错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-18 21:27:12

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

代码语言:javascript
运行
复制
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(),以此类推。

上面的解决方案是相当普遍的概念,可以用来在发电机启动之前检查一些东西--除了一些非常强烈的内省之外,它应该可以作为替代大多数发电机的一种方法,在可能需要这类东西的地方。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25372248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档