2

当我尝试在 Python 中进行以下构造时,我"No module named foo" 在第二行得到

import my_package.my_very_long_module_name as foo
from foo import f1, f2, f3
from foo import a, b, c
from foo import x, y, z

my_very_long_module_name是文件夹中的一个模块 ( my_very_long_module_name.py) my_package(文件夹中有文件__init__.py)。

为什么上面的第二行失败?我是否不允许从别名模块导入名称?

如果这种构造在 Python 中是不合法的,还有其他方法可以做到这一点吗?(

4

3 回答 3

4
import my_package.my_very_long_module_name as foo
from foo import f1, f2, f3

第二行失败,因为 python 将尝试查找模块名称foo.py,它不会使用foo您刚刚导入的变量。

你可以尝试这样的事情:

import my_package.my_very_long_module_name as foo
f1, f2, f3 = foo.f1, foo.f2, foo.f3
del foo
于 2013-08-13T17:57:54.230 回答
1

您想要实现的目标可以通过修改 sys.modules 字典来完成。

import sys
import my_package.my_very_long_module_name as foo

sys.modules['foo'] = foo
from foo import f1, f2, f3
from foo import a, b, c
from foo import x, y, z


警告:这样做foo会为这个 python 会话全局注册,所以任何其他尝试的模块import foo都会以my_package.my_very_long_module_name

对于您的特定情况,由于全球影响,这可能是解决此问题的不好方法。但是,当需要全局重命名时,这可能很有用。

于 2013-12-16T03:55:52.180 回答
1

虽然不能在 import 语句中使用变量是正确的,但您可以简单地访问模块的变量。

因此,您可以这样做:

a = foo.a

globals如果你坚持,你甚至可以写信。不过,老实说,我鼓励您只foo.a在代码中使用限定符。它会使它更具可读性。

于 2013-08-13T18:35:18.823 回答