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 *
を入れておもしろいが、それは間違っているようだ。または、私はいくつかの単純な解決策が欠けている?
明白な答えは、最初に 'foo.foo.Foo'のような愚かなネストされた名前で名前を付けないでください。名前空間は偉大なアイデアですが(それ以上のことをやってみましょう)、レベルを超えたネストされた名前空間は面倒です。ネストされたパッケージを本当に必要とするならば、少なくとも各レベルで意味のある(重複しない)名前を付けてください。 – Blckknght
深い名前空間については、私は確かに同意しますが、これは1つの余分なレベルに過ぎず、例はたくさんあります(os.path、logging config、redundantly datetime.datetime)。それは、それを行う欲求である必要はなく、途中の各ステップでの誘惑が増えます。 :) – Scott
はい、 'foo.foo'があればこの問題はありません。 'foo.foo'の内容が' foo'にないのはなぜですか? 'datetime.datetime'はモジュールではありません。そしてそれは非常にひどくひどく命名されています。 –