2016-06-13 1 views
3

Python規約では、モジュールのインポートを公開インターフェースの一部と見なすべきですか?python imports - 公開または私的な規約

私はこれを行い、いくつかのコードを持っている:私はするかどうかを決定しようとしている

from foo import b 

foo.py

from a import b 

がbar.pyをbをリファクタリングすると、aから直接bをインポートできます。私は、foo.pyがbar.pyが使用するbの実装を制御したい場合があるかもしれないと思います。しかし、そうでない場合は、両方のモジュールに同じ方法でインポートする方がよいでしょうか?

+0

あなたがそれらをプライベートにしたい場合は、必ず_b'として '輸入bを行うことができます。また、この質問は、あなたがそれがトピックとして閉じられるのを防ぐより客観的な言い回しをする方法を考えることができる場合、少し意見に基づいているようです。 –

答えて

2

Python規約では、モジュールのインポートをパブリックインターフェイスの一部とみなすべきですか、そうでないとしますか?

モジュールの公開APIは、モジュールがその公開APIを文書化しているものであれば何でも構いません。モジュールfoobを提供していることを文書化した場合、bは実際にfooで定義されているか、どこからでもインポートされているかどうかにかかわらず、公開APIの一部です。

多くのモジュールは、コードを複数のファイルに分割し、すべての要素を1つのモジュールにまとめてインポートします。例えば、collectionsモジュールはC _collectionsモジュールにそのコードの一部を置き、

from _collections import deque, defaultdict 

dequedefaultdictは明確collectionsの公開APIの一部ではありません。

モジュールがパブリックAPIの一部ではないものをインポートする場合は、import thing as _thingを実行して、インポートされたものがインプリメンテーションの詳細であることを示すアンダースコアを付けることをお勧めします。

2

ドキュメンテーションの観点。大会では、アンダースコアで始まらないものはすべて公開されています。インポートシンボルをプライベートとしてマークする場合は、from a import b as _bのように下線を付けてエイリアスします。代わりがあります。代わりに__all__を使用して、あなたが公開すると考えるシンボルを宣言することができます。技術的にはfrom module import *にしか影響しませんが、意図的な宣言でもあります。

依存性の観点から、なぜなら、そうでなければ、開発プロセスの後の段階で循環インポートの問題に遭遇する可能性が高くなるからです。明示的なZen of Pythonによると

とシンプルなが複雑よりも優れている暗黙的よりも優れています。したがって、モジュールaがシンボルbを提供する場合、bを使用するすべてのモジュールがaからそれをインポートすることは妥当です。

0

忍者モードのモジュール定義

def defmod(): 
    global foo 
    import sys 
    def foo(): return sys.path 
defmod() 
del defmod 
関連する問題