Python生成器中的参数检查

2024-04-16 08:02:05 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法检查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/existence/path”不存在,也不会引发异常。但是,当使用生成器(通过g进行迭代)时,会抛出一个错误。你知道吗

我更希望在尝试创建generator对象时抛出错误。你知道吗


Tags: path对象inforifos错误root
1条回答
网友
1楼 · 发布于 2024-04-16 08:02:05

据我所知,唯一好的方法是将(非检查)生成器包装在一个函数中,该函数执行以下检查:

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__在python3.x中)方法之前不会执行任何操作。在这一点上,它执行第一个yield之前的所有代码,然后停止执行,直到下一次调用.next(),依此类推。你知道吗

上面的解决方案是一个非常通用的概念,可以用来在发电机启动前检查东西,除非进行一些非常激烈的自省,否则它应该可以作为大多数发电机的替代品,在这种情况下可能是必要的。你知道吗

相关问题 更多 >