0

我正在尝试创建一个__init__.py文件,它将 *.py 文件中的所有函数从目录导入命名空间(目录的名称)。逻辑如下图所示:

for f in os.listdir(wd):
    if not f.endswith('.py') or f == '__init__.py':
        continue
    names = get_public_functions(open(wd + f))
    try:
        mod = __import__(f[:-3], fromlist=names)
        for fn in names:
            fun = getattr(mod, fn)
            setattr(sys.modules[__name__], fn, fun)
    except Exception as e: 
        for fn in names:
            setattr(sys.modules[__name__], fn, lambda: str(e))

因此,您可以观察到,如果文件中存在语法错误,函数仍然会被导入,但它们会返回语法错误(作为字符串)。

令人沮丧的是,当多个文件中存在语法错误时,我期待的是:

mymodule.fn() => error1,
mymodule.fn2() => error1 (these were from the first file),
mymodule.fn3() => error2 etc.

我只收到最后一条错误消息。我认为错误一定在except块中,但我想不通。任何人都可以帮忙吗?

4

1 回答 1

1

您需要将 的值绑定e到您创建的 lambda 的范围。或者更确切地说,您想将str(e)结果绑定到 lambda:

error = str(e)
for fn in names:
    setattr(sys.modules[__name__], fn, lambda error=error: error

现在每个 lambda 都有一个关键字参数来存储error. 因为error参数是具有默认值的关键字参数,所以当使用参数调用时,您的 lambdas 仍然有效。

另一种方法是创建一个新的函数范围:

def errorfunction(error):
    return lambda: error

error = str(e)
for fn in names:
    setattr(sys.modules[__name__], fn, errorfunction(error)
于 2013-03-11T15:24:37.863 回答