2013-04-10 19 views
6

私は約30人の開発者のチームのためのPythonコーディングガイドラインのセットをオーサリングしています。私の文書の基礎として、今まで私はGoogle python style guidePEP 8 style guideを研究し、両方からの情報を取り入れました。Pythonでは、クラスのインポートと、そのクラスのモジュールのインポートの長所と短所は何ですか?

GoogleのスタイルガイドがPEP 8よりも制限の厳しい場所は、インポートされています。 Googleのガイドでは、パッケージやモジュールのみをインポートし、より修飾された名前でその中のアイテムを参照するように要求しています。例:

from pkg import module 
... 
my_class = module.MyClass() 

「各識別子のソースは一貫性のある方法で表示されています」ということです。私たちのプロジェクトでは、パッケージを2〜3レベル深く編成しようと考えています。そのため、識別子の完全なソースを知るためには、読者はインポートステートメントを調べる必要があります。私は「好みのスタイル」として輸入のこのスタイルを提唱したいと思います:

from pkg.module import MyClass 
... 
my_class = MyClass() 

私見名はより簡潔であれば、このようなリストの内包表記としてPythonの構築物中の可読性が向上しています。

私が不明な点は、Pythonインタプリタが背後で何をするかということです。たとえば、MyClassはこのモジュールとこのモジュールのすべてのインポータの両方のグローバル名前空間の一部になっていますか? (これは悪いことですが、奇妙なバグにつながる可能性があります;これが真実なら、私はGoogleのスタイルを主張します)。

私のPython開発の経験は約6ヶ月に制限されています(そして、相談するプロジェクトには多くの専門家がいません)ので、私はコミュニティからより多くの情報を得たいと思っていました。ここで私はすでに調査してきたいくつかの項目は、次のとおりです。

effbot - discussion on imports

stack overflow - import vs. from import

python documentation - modules

python documentation - import

は、ご回答いただきありがとうございます!

+3

*あなたが直接参照できるものは、モジュール内のグローバルです。 'MyClass'は実際には2番目の例ではグローバルですが、最初は' module'です。 –

+0

私は 'import blah'と' vlah = blah.vlah'をします。私が 'blah import vlah'を行ったとしても、モジュール全体が" blah "とにかく処理されるからです。 – thkang

+0

Martijnが答えたグローバルな質問以外に、あなたは何か他のものを探していましたか?もしそうなら、あなたは質問をより明確にすることができますか? – msw

答えて

5

Pythonでは、複数のモジュールでグローバルな変数は存在しません。 from pkg.module import MyClassを実行する場合、MyClassは、そのモジュールのグローバル名前空間にありますが、他のモジュール(MyClassをインポートするモジュールをインポートするモジュールを含む)では使用できません。

あなたのより一般的な質問としては、状況によってはいずれかのインポートメカニズムを使用できます。

# Awkward 
from package import reallylongmodule 
reallylongmodule.MyClass() 

# Less awkward 
from package import reallylongmodule as rlm 
rlm.MyClass() 

クラス名が、それはから来て、どこが言うことができることを十分に独特であれば大丈夫できるだけのクラスをインポート:モジュール名が長い場合は、別の名前で、それをインポートすることにより、いくつかの短縮を得ることができますそれは何ですか。しかし、比較的「記述されていない」名前のクラスを定義する複数のモジュール(「プロセッサ」、「ユニット」、「データ」、「マネージャ」など)がある場合は、モジュール名でアクセスして明確にすることをお勧めしますあなたがしていること。

スタイルガイドは最終的にガイドであり、法律ではありません。私の好みは、明快さと可読性を最大限にする仕組みを選択することです。これには、長くて面倒な名前を避けることと、短くて漠然とした名前を避けることとの間にトレードオフがあります。このトレードオフの仕方は、使用しているライブラリやその使い方(たとえば、インポートするモジュールの数、そこからインポートするものの数など)によって異なります。

+0

合意!いずれのスタイルも大丈夫だと思います。クラス(または関数)を直接インポートすることに関連する微妙な影響があることがさらに懸念されました。 – Tom

0

コードガイドを書く代わりに、pylint、pep8、pyflakesなどの自動コードチェッカーを使用することをお勧めします。

名前の衝突の可能性があるので、個人的にはfrom pkg import moduleを使用することをお勧めします。

from package import module 

def my_fun(): 
    module.function() 

Inpreterは3ハッシュテーブルのルックアップローカル関数の名前空間、現在のモジュールのグローバルな名前空間と、インポートモジュールの名前空間を行う必要があります。インポート時に実行された最後の1:

from package.module import function 

def my_fun(): 
    function() 

ではそれだけで2ルックアップを行います。

+0

私は自動コードチェッカーの使用に同意します。お客様のドキュメントが必要となります。私はおそらくそのガイドラインの項目を作るだろう! – Tom

関連する問題