2016-04-02 8 views
0

foo.pyというモジュールを含むpackパッケージから始めましょう。これはPythonの反パターンですか? 'foo.foo as foo'はfooパッケージの残りの部分をシャドウします

pack/ 
pack/__init__.py 
pack/foo.py  # Defines class Foo 

しかし理由のために、私はサブパッケージにfoo.pyを移動する必要があると判断しました。おそらく私のfooは非常に強く、私はそれを管理するためのより多くの機能が必要です。サブパッケージは、すべてのfooについてですので、私は今、私たちは

pack/ 
pack/__init__.py 
pack/foo 
pack/foo/__init__.py 
pack/foo/foo.py  # Defines class Foo 

「あ」を持って、私は互換性のある物事を後方にし、呼び出し元のコードに過度のfoo-を負わ避けることができる」、と言うだけでなくfooという名前を付けますpack/__init__.py ...

$ cat pack/__init__.py 
import foo.foo as foo 

で次のインポートとpack.foo.foo.Foo()のネス...私はFooを初期化するためにpack.foo.Foo()を使用できるように。」

残念ながら、これはfoo.pyモジュールがfooパッケージの残りの部分をシャドウし、内容がpack/foo/foo.pyにしか見えないことを意味します。

これはすべて予想される動作ですが、私の質問は、これが反パターンのレベルにまで上がりますか?それは各ステップで意思決定が一定の意味を持つように思えるので、サブパッケージを動機付ける追加機能が「私たちはどうですか?」と言われるまで、何度もさまようのは簡単な道のりです(数回あります)。

名前付けと下位互換性を考慮して、このようなモジュールをサブパッケージ化するためのpythonic方法はありますか? foo.foo.Fooは特に気になりませんが(datetime.datetimeにもかかわらず)、おそらく答えは "それを処理する"ことで、後方互換性を食べることです。私はどこかでfrom foo import *を入れておもしろいが、それは間違っているようだ。または、私はいくつかの単純な解決策が欠けている?

+2

明白な答えは、最初に 'foo.foo.Foo'のような愚かなネストされた名前で名前を付けないでください。名前空間は偉大なアイデアですが(それ以上のことをやってみましょう)、レベルを超えたネストされた名前空間は面倒です。ネストされたパッケージを本当に必要とするならば、少なくとも各レベルで意味のある(重複しない)名前を付けてください。 – Blckknght

+0

深い名前空間については、私は確かに同意しますが、これは1つの余分なレベルに過ぎず、例はたくさんあります(os.path、logging config、redundantly datetime.datetime)。それは、それを行う欲求である必要はなく、途中の各ステップでの誘惑が増えます。 :) – Scott

+0

はい、 'foo.foo'があればこの問題はありません。 'foo.foo'の内容が' foo'にないのはなぜですか? 'datetime.datetime'はモジュールではありません。そしてそれは非常にひどくひどく命名されています。 –

答えて

0

本当ソリューションは、このような深くネストされた名前空間を避けるためであるというのが私のコメントにもかかわらず、私はあなたがそれでは1回、問題を解決するための最善のアプローチはpack/foo/__init__.pyファイルにpack/foo/foo.pyの内容を移動するだろうと思います。あなたはまだpack.fooパッケージ内に他のモジュールを持つことができますが、クラスにアクセスして、それ以外のものはfoo.pyと同じ場所(pack.foo)からアクセスしてください。

関連する問題