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

时间:2016-08-05 16:07:34

标签: python module

我有一些小的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处理方法是什么?我是否必须为每个模块文件提供全局唯一名称?

1 个答案:

答案 0 :(得分:3)

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

因此,import pyglet会在考虑顶级msa.pyglet之前找到pyglet

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

from __future__ import absolute_import

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

有关详细信息,请参阅PEP 328 -- Imports: Multi-Line and Absolute/Relative