2016-08-05 8 views
2

私はいくつかの異なる研究プロジェクトで使用できるように、私は 'msa'名前空間の下に整理するいくつかの小さな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(...)) 

# 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:同じ名前のトップレベルパッケージが別のものをシャドーイングし、* packages *には関係しません。 –

答えて

2

Python 2では、パッケージ修飾子なしでパッケージにインポートすると、実際にはパッケージローカルモジュールが検索されます。

したがって、pygletが考えられる前にimport pygletmsa.pygletとなります。今

from __future__ import absolute_import 

import pygletしかmsa.pyglet、トップレベルの名前を決して見つけることができません:非修飾名は常にトップレベル名になっているデフォルトは、Pythonの3動作を行うための絶対的な輸入へ

スイッチ。 msa名前空間内の他のモジュールを参照するには、from . import pygletまたはfrom msa import pygletを使用してください。

詳細はPEP 328 -- Imports: Multi-Line and Absolute/Relativeを参照してください。

+0

ok superが動作し、まさに私が感謝の必要なものです。そして、これは安全です(そして清潔です)?つまり、私のモジュールのすべての最初の行にその行を追加すると、他の人が他のアプリケーションを壊す可能性はありません。 – memo

+0

@memo: 'from __future__ import'宣言は、そのモジュールにのみ適用され、他のものには適用されません。あなたは他のアプリを壊すことはありません。 –

+0

はい、それは私が心配していたビットではありませんが、PYTHONPATHのパス(msa)のサブフォルダに自分自身のmath.py、pyglet.pyなどを持っていれば問題が生じるのだろうかと思っていました。しかし、PEP328を読むと、これは一般的な問題(他の人が使用していないモジュールの名前を常に見つけることはできない)のようであり、python3/absolute importで対処しようとしています。 – memo

関連する問題