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