2016-08-05 181 views
2

我有許多小型utils模塊,我在'msa'命名空間下組織,因此我可以在許多不同的研究項目中使用。目前,我有他們舉辦這樣的:與現有模塊具有相同名稱的python模塊名稱

# 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_」和使用這樣的:

# 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(...)) 

從進口時,這不應導致名稱衝突外部,但是當模塊本身導入具有衝突名稱的模塊時會有名稱衝突。例如。 msa/pyglet需要導入pyglet(外部的),但最終試圖導入它自己。同樣,任何試圖導入標準數學庫的模塊都只導入我的數學模塊。這是完全可以理解的。但處理這個問題的通常pythonic方式是什麼?我必須爲每個模塊文件指定一個全球唯一的名稱嗎?

+0

可能相關:[當存在同名模塊時從內建庫導入](http://stackoverflow.com/questions/6031584/importing-from-builtin-library-when-module-with-same-name-exists ) – Aprillion

+0

@Aprillion:談論一個頂級包的同名影子,而不涉及*包*。 –

回答

2

在Python 2中,在沒有包限定符的包中導入的確是首先查找包本地模塊。

因此,在考慮頂級pyglet之前,import pyglet將發現msa.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瞭解更多詳情。

+0

好的超級工程,正是我所需要的感謝。這是安全的(和乾淨)做?即如果我將該行添加爲所有模塊的第一行,那麼就沒有機會打破其他人在我係統中使用的其他任何應用程序? – memo

+0

@memo:'from __future__ import'聲明只適用於該模塊,而不適用於其他任何內容。你不會破壞任何其他應用程序。 –

+0

是的,這不是我關心的那一點,但我想知道是否在PYTHONPATH中的路徑(msa)的子文件夾中有我自己的math.py,pyglet.py等會產生任何問題。但是讀過PEP328,看起來這是一個常見問題(不能總是找到其他模塊沒有使用的名稱),並試圖用python3 /絕對導入來解決。 – memo

相關問題