Python:相对导入的别名

9

是否可以使用相对导入的方式,为同一包中的模块设置别名?

比如我有以下的包结构:

lib/
    foobar/
        __init__.py
        foo.py
        bar.py

在foo.py中,我想使用来自bar.py的某些内容,但我想将其用作“bar.my_function”,因此我尝试了import .bar as barimport .bar,但都不起作用(无效的语法异常)。我尝试过python2.7和python3.4(后者是我的目标版本)。
然而,现在有效的方法是import foobar.bar as bar,即绝对导入而不是相对导入。这是一个可以接受的解决方案,因为我不希望包名称发生变化(即使发生变化,在代码中也没有太多需要更改的内容),但如果我能使用相对导入实现这一点,那就更好了!
#import .bar as bar # why not?!?
#import .bar # shot in the dark
import foobar.bar as bar # current solution
1个回答

16

你需要使用

from . import bar

文档指出:

[...] 可以使用 from module import name 形式的导入语句编写明确的相对导入。这些明确的相对导入使用前导点来指示涉及相对导入的当前和父包。 [...]


当然,我应该自己意识到这一点!脸掌 但是,回想起来总比预测容易。感谢您的回答! - flotzilla
1
新的语法还允许您为相对导入的模块应用别名(例如,如果模块本身具有较长的名称)。from . import long_module_name as bar(我花了很长时间搜索问题和文档才找到这个!)。与Python 2中的隐式相对导入让您只需执行import long_module_name as bar相比,它有点笨拙,但至少仍然作为一种选择可用。 - JDM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接