すでにフラットパッケージを使用しているので、ネストされたパッケージで発生した問題は予想していませんでした。ここは…
ディレクトリレイアウト
dir
|
+-- test.py
|
+-- package
|
+-- __init__.py
|
+-- subpackage
|
+-- __init__.py
|
+-- module.py
内容のinitの.py
package/__init__.py
とpackage/subpackage/__init__.py
は両方とも空です。
の内容 module.py
# file `package/subpackage/module.py`
attribute1 = "value 1"
attribute2 = "value 2"
attribute3 = "value 3"
# and as many more as you want...
test.py
(3バージョン)の内容
バージョン1
# file test.py
from package.subpackage.module import *
print attribute1 # OK
これは、物をインポートする(すべてをまとめてインポートする)悪い方法であり、安全ではありませんが、機能します。
バージョン2
# file test.py
import package.subpackage.module
from package.subpackage import module # Alternative
from module import attribute1
アイテムごとにインポートするより安全な方法ですが、失敗します。Pythonはこれを望んでいません:「モジュールという名前のモジュールはありません」というメッセージで失敗します。しかしながら …
# file test.py
import package.subpackage.module
from package.subpackage import module # Alternative
print module # Surprise here
…と言い<module 'package.subpackage.module' from '...'>
ます。これはモジュールですが、モジュールではありません/ -P 8-O ...ええと
バージョン3
# file test.py v3
from package.subpackage.module import attribute1
print attribute1 # OK
これは動作します。それで、あなたは常にオーバーキルプレフィックスを使用することを余儀なくされるか、バージョン#1のように安全でない方法を使用し、Pythonによって安全で便利な方法を使用することを許可されていませんか?安全で不必要な長いプレフィックスを回避するより良い方法は、Pythonが拒否する唯一の方法ですか?これはimport *
、それが長すぎるプレフィックスを愛しているためですか(これはこの慣行を強制するのに役立ちません)?
難しい言葉で申し訳ありませんが、それは私がこの愚かなような行動を回避しようとしている2日間です。どこかで完全に間違っていない限り、Pythonのパッケージとサブパッケージのモデルで何かが本当に壊れているような気がします。
ノート
- 私は
sys.path
、グローバルな副作用を回避するために、または同じグローバルな効果で*.pth
遊ぶための単なる別の方法であるファイルに依存したくありませんsys.path
。ソリューションをクリーンにするには、ローカルのみである必要があります。どちらのPythonもサブパッケージを処理できますが、そうではありませんが、ローカルのものを処理できるようにするためにグローバル構成で遊ぶ必要はありません。 - でimportsを使用しようとしましたが
package/subpackage/__init__.py
、何も解決せず、同じことを行い、subpackage
モジュールであるprint subpackage
と言っているのに、既知のモジュールではないと文句を言います(これも奇妙な動作です)。
私は完全に間違っているかもしれませんが(私が好むオプション)、これは私がPythonに非常に失望していると感じさせます。
私が試した3つ以外の既知の方法はありますか?私が知らないことは?
(はぁ)
-----%<-----編集----->%-----
これまでの結論(人々のコメントの後)
すべてのパッケージ参照はグローバルディクショナリにのみ送信されるため、Pythonの実際のサブパッケージのようなものはありません。つまり、ローカルディクショナリがないため、ローカルパッケージ参照を管理する方法がありません。
フルプレフィックスまたはショートプレフィックスまたはエイリアスを使用する必要があります。のように:
フルプレフィックスバージョン
from package.subpackage.module import attribute1
# An repeat it again an again
# But after that, you can simply:
use_of (attribute1)
短いプレフィックスバージョン(ただし、繰り返しプレフィックス)
from package.subpackage import module
# Short but then you have to do:
use_of (module.attribute1)
# and repeat the prefix at every use place
または、上記のバリエーション。
from package.subpackage import module as m
use_of (m.attribute1)
# `m` is a shorter prefix, but you could as well
# define a more meaningful name after the context
因数分解バージョン
複数のエンティティを一度にまとめてインポートすることを気にしない場合は、次のことができます。
from package.subpackage.module import attribute1, attribute2
# and etc.
私の最初の好みではありませんが(インポートされたエンティティごとに1つのインポートステートメントを使用することを好みます)、個人的に好むものかもしれません。
更新(2012-09-14):
最後に、レイアウトに関するコメントを除いて、実際には問題ないようです。上記の代わりに、私は使用しました:
from package.subpackage.module import (
attribute1,
attribute2,
attribute3,
...) # and etc.