Python将目录中文件的所有函数导入一个名称空间

时间:2013-03-11 15:19:45

标签: python

我试图创建一个__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块中,但我无法理解。有人可以帮忙吗?

1 个答案:

答案 0 :(得分: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)