3

これは私の以前の質問に関連しています。

構成ファイルの保存方法と読み取り方法を理解しています。ConfigParserConfigObjなどの選択肢があります。

架空の「eggs」モジュールについて、次の構造を考えてみましょう。

卵/
  一般/
    __init__.py
    config.py
  ふー/
    __init__.py
    a.py

「eggs.foo.a」にはいくつかの構成情報が必要です。私が現在していることは、「a」で、

インポートeggs.common.config
. これに関する 1 つの問題は、'a' がモジュール ツリーのより深いレベルに移動すると、相対インポートが壊れることです。絶対インポートはそうではありませんが、モジュールが PYTHONPATH にある必要があります。

上記の絶対インポートに代わる可能性のある方法は、相対インポートです。したがって、「a」では、

インポート.common.config

相対インポートと絶対インポートのメリットについて議論することなく、他の可能な解決策について疑問に思っていましたか?

編集 - VCS コンテキストを削除しました

4

5 に答える 5

2

「インポート...モジュールがPYTHONPATHにある必要があります」

右。

では、設定の何が問題になっていますPYTHONPATHか?

于 2008-12-06T14:41:43.233 に答える
0

pkg_resourcesからの require ステートメントが必要かもしれません。

于 2008-12-06T02:35:54.447 に答える
0

この質問と以前の質問から理解できるように、必要なパスは 1 つだけですsys.pathgitいつでも 1 つのブランチのみがチェックアウトされる (単一の作業ディレクトリ) 場合の VCS (前の質問で言及)について話しているとします。ブランチの切り替えやマージは、好きなだけ頻繁に行うことができます。

于 2008-12-06T02:41:41.003 に答える
0

私は、より「プッシュベース」の種類のソリューションに沿ったものを考えています。共有オブジェクトをインポートする代わりに (構成用であろうと、何らかのユーティリティ関数であろうと)、最上位のinitにそれをエクスポートさせ、各中間のinitにそれを上のレイヤーからインポートさせ、すぐに再エクスポートさせます。

Python の用語が正しいかどうかわかりません。間違っている場合は修正してください。

このように、共有オブジェクト (この例のコンテキストでは構成情報を表す) を使用する必要があるモジュールは、それを独自のレベルでinitからインポートするだけです。

これは理にかなっていますか?

于 2008-12-06T04:38:19.287 に答える
0

各サブディレクトリを に追加することで、インポート メカニズムをだますことができますegg/__init__.py

__path__.append(__path__[0]+"\\common")
__path__.append(__path__[0]+"\\foo")

次に、egg 名前空間からすべてのモジュールをインポートするだけです。例import egg.bar(ファイル Egg/foo/bar.py がある場合)。
foo と common はパッケージであってはならないことに注意してください。つまり、それらに__init__.pyファイルが含まれていてはなりません。

このソリューションは、最終的にファイルを移動するという問題を完全に解決します。ただし、名前空間がフラット化されるため、特に大きなプロジェクトではそれほど良くない場合があります。個人的には、完全な名前解決を好みます。

于 2008-12-07T00:19:24.970 に答える