我有一些小的utils模块,我在'msa'命名空间下组织,所以我可以在许多不同的研究项目中使用。目前,我有这样的组织:
{
"rules": {
".read": "auth != null",
".write": "auth != null",
"accounts": {
".write": "auth != null",
".read": "auth != null",
"$uid": {
".write": "$uid === auth.uid",
".read": "$uid === auth.uid"
}
}
}
}
但是我想避免使用名称中的'msa_'并使用如下:
# 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(...))
从外部导入时不会导致名称冲突,但是当模块本身导入名称冲突的模块时会出现名称冲突。例如。 msa / pyglet需要导入pyglet(外部的),但最终会尝试导入自己。同样,任何尝试导入标准数学库的模块都只导入我的数学模块。这一切都是可以理解的。但通常的pythonic处理方法是什么?我是否必须为每个模块文件提供全局唯一名称?
答案 0 :(得分:3)
在Python 2中,没有包限定符的包中的导入确实首先查找包本地模块。
因此,import pyglet
会在考虑顶级msa.pyglet
之前找到pyglet
。
切换到绝对导入以使Python 3行为成为默认行为,其中非限定名称始终是顶级名称:
from __future__ import absolute_import
现在import pyglet
只能找到顶级名称,而不是msa.pyglet
。要引用msa
命名空间中的其他模块,请使用from . import pyglet
或from msa import pyglet
。
有关详细信息,请参阅PEP 328 -- Imports: Multi-Line and Absolute/Relative。