2012-04-05 12 views
1

私はprivateモジュールまたはpackageモジュールの洗練されたツリーを持つ大規模なライブラリパッケージを持っています - それをfunnylibとしましょう。エンドユーザーが直接内部モジュール(のようなfunnylib.foofunnylib.barなど)をタッチすることは望ましいことではないですので、私が代わりに外部インタフェースを提供したい - このように:d2:デフォルトのパッケージモジュール(__init__.pyのようですが、Dの場合)

funnylib.d:

public import funnylib.foo; 
public import funnylib.bar; 
public import funnylib.baz; 

だけであることをエンドユーザがimport funnylibのようにインポートしました。問題は、Dがfunnylib.dfunnylib/を同時に持つことを禁止していることです。

Pythonで__init__.pyのように、「default package module」のようなものがありますか?いいえ、上記の設計を行う正しい方法は何ですか?

アップデート1:私はfunnylibはもはやアクセスpackageシンボルを保護しますと、そのfunnylibは罰金インポートされますが、これは保護低下(強く望ましくない)のコストを持つことになり、funnylib_privateのようにパッケージ化するiternalモジュールを移動について考え、そして不快なファイルレイアウトにつながります。

答えて

1

をインポートするために文書化されている公共の輸入で簡単なallモジュールを作成します。したがって、例えば、Phobosはstd/algorithm.dstd/algorithm/sorting.dを持つことができませんでした。 std/algorithm.dstd/algorithmが矛盾します。典型的なことは、ratchet freak describesであり、そのパッケージ内のすべてのモジュールを公にインポートするallという名前のモジュールを使用します。あなたはすべてのサブモジュールを使用しているという事実を隠したい場合しかし、あなたは単に

funnylib.d 
_funnylib/foo.d 
_funnylib/bar.d 
_funnylib/baz.d 

なくどこでも_funnylibを文書化するような何かを行うことができ、それは、DDOCで非常にうまく機能しません。それぞれ_funnylibモジュールのドキュメントを生成する予定であり、funnylib.dのために生成するものは、ドキュメント化するシンボルがないため、モジュールドキュメントです。モジュールシステムは、あなたがしようとしているようなモジュールを隠してしまうという考えで設計されていません。それが(大きくなりすぎたとき

さて、は、それが可能になるためproposal under discussionはきれいにパッケージにモジュールを分割するために、現在あり例えばそのように明示的などstd.algorithm.searchstd.algorithm.sorting、コードにstd.algorithmを分割する場合std.algorithm.countUntilは現在でもstd.algorithm.search.countUntilになっていても使用されません)。一度それが整理されれば、それを使うことができますが、ドキュメントはあなたのuber-moduleではなく、各サブモジュールについても実行されます。これは本当にあなたがモジュールを分割しているという事実を隠そうとするのではなく、コードを変換する手段としての意味です。これは、基本的にはallモジュールを使用することと同じですが、パッケージが単一のモジュールであった場合にコードを破るのを避けるために、意味論的な砂糖を使用しています。

+0

私はモジュールエンドユーザのインポートがパッケージであるという事実を隠そうとはしません。実際には、それはきれいでクリアなものにしておきたい - import funnylib.here_is_module_which_imports_all_other_stuff;ではなく、 'import funnylib;ですから、DIP16が受け入れられるように、一時的な回避策として 'funnylib.all'を使用します。これは広く使われるようになります。 – toriningen

1

あなたはモジュールと同じ名前のパッケージを使用することはできませんライブラリ

module funnylib.all; 

public import funnylib.foo; 
public import funnylib.bar; 
public import funnylib.baz; 
+0

これは読みやすさを低下させ、私のインターフェイスを「傑出した」マイナスにします。他のライブラリを名前だけでインポートすることができます。なぜなら、この「特別な」ものは 'name.all'を使ってインポートする必要があります。 – toriningen

+0

議論の余地があります。このようにして、すべてのモジュール、特別なモジュール群を含む "special"、開発中のいくつかの新しいモジュールを含む "devel"など、 "all"を持つことができます...私はPythonとDを比較しません - __init __。py'はとても醜いです... – DejanLekic

+0

'__init__'は実際には醜いですが、Pythonは透過的にパッケージをインポートすることができます。 - ' import funnylib .__ init__'は残念です。 – toriningen

関連する問題