与现有模块同名的python模块名称

mem*_*emo 5 python module

我在“ msa”命名空间下组织了许多小型utils模块,因此可以在许多不同的研究项目中使用。目前,我将它们组织成这样:

# folder structure:
packages  <-- in my pythonpath
--msa
----msa_utils.py
----msa_geom.py
----msa_pyglet.py
----msa_math.py
----etc

# imported and used this like
from msa import msa_pyglet
from msa import msa_math
msa_pyglet.draw_rect(msa_math.lerp(...))
Run Code Online (Sandbox Code Playgroud)

但是,我想避免名称中的“ msa_”,而是这样使用:

# folder structure:
packages  <-- in my pythonpath
--msa
----utils.py
----geom.py
----pyglet.py
----math.py
----etc

# imported and used this like
import msa.pyglet
import msa.math
msa.pyglet.draw_rect(msa.math.lerp(...))
Run Code Online (Sandbox Code Playgroud)

从外部导入时,这不会引起名称冲突,但是,当模块本身导入名称冲突的模块时,就会发生名称冲突。例如,msa / pyglet需要导入pyglet(外部的),但最终尝试导入自身。同样,任何尝试导入标准数学库的模块都只会导入我的数学模块。这都是可以理解的。但是,处理这种问题的常用pythonic方法是什么?我必须给每个模块文件一个全局唯一的名称吗?

Mar*_*ers 6

在 Python 2 中,在没有包限定符的包中导入确实首先会查找包本地模块。

这样,import pyglet就会发现msa.pyglet在顶层pyglet被考虑之前。

切换到绝对导入以使 Python 3 行为成为默认行为,其中非限定名称始终是顶级名称:

from __future__ import absolute_import
Run Code Online (Sandbox Code Playgroud)

现在import pyglet只能找到顶级名称,永远找不到msa.pyglet。要引用msa命名空间中的其他模块,请使用from . import pygletfrom msa import pyglet

有关更多详细信息,请参阅PEP 328 -导入:多行和绝对/相对