'from X import a'対 'import X; X.a '
-
06-07-2019 - |
質問
Pythonプログラマーが次のスタイルをかなり一貫して使用しているのを見ました(スタイル1と呼びます):
import some_module
# Use some_module.some_identifier in various places.
このスタイルをサポートするには、" explicit is better than暗黙的" 格言。他のプログラマがこのスタイル(スタイル2)を使用しているのを見ました:
from some_module import some_identifier
# Use some_identifier in various places.
スタイル2の主な利点は、特にダックタイピングを使用した場合の保守性です。理想的なsome_other_moduleのsome_moduleを交換することがあります。スタイル2は"可読性カウント" という格言でポイントを獲得していると感じます。私は反対する傾向がありますが、最初のスタイルを使用するときは、検索と置換も同様に良い選択肢であると常に主張できます。
補遺: as
を使用して、 some_module
から some_other_module
への切り替えを解決できることに注意してください。スタイル1. current モジュールに some_identifier
を実装することもよくあることを忘れていました。これにより、同等の some_module
が作成されますコンテナはやや厄介です。
解決
両方の場合に使用法があるので、これはどちらかまたは問題ではないと思います。
次の場合は、モジュール import x、y、z
からの使用を検討します:
-
インポートするものはかなり少ない
-
インポートされた関数の目的は、モジュール名と離婚したときに明らかです。名前がかなり一般的なものである場合、他の人と衝突し、ほとんど語らないことがあります。例えば。
remove
を見てもほとんどわかりませんが、os.remove
はおそらくファイルを扱っていることを示唆します。 -
名前は衝突しません。上記と似ていますが、より重要です。 絶対にしないでください:
from os import open
import module [as renamed_module]
には、使用時に呼び出されるものに関するコンテキストをもう少し提供するという利点があります。モジュールが実際により多くの情報を提供していない場合、これが少し乱雑であり、パフォーマンスがわずかに低いという欠点があります(1回ではなく2回のルックアップ)。
ただし、テスト時にも利点があり(例:os.openをすべてのモジュールを変更せずにモックオブジェクトに置き換える)、可変モジュールを使用する場合に使用する必要があります。例:
import config
config.dburl = 'sqlite:///test.db'
疑わしい場合は、常に importモジュール
スタイルを使用します。
他のヒント
次の構文が存在する場合:
import some_other_module as some_module
スタイル2の保守性の引数はもはや関係ありません。
スタイル1を使用する傾向があります。通常、典型的なPythonプログラムでは、インポートしたパッケージ名を明示的に数回だけ参照することがわかります。それ以外はすべてオブジェクト上のメソッドです。もちろん、インポートされたパッケージを参照する必要はありません。
通常、これを決定するためにしきい値を使用します。 some_module
内で多くのものを使用する場合は、次を使用します。
import some_module as sm
x = sm.whatever
必要なものが1つまたは2つしかない場合:
from some_module import whatever
x = whatever
もちろん、 some_other_module
の whatever
は必要ないと仮定しています。
インポートで as
句を使用する傾向があるため、今後 で入力を減らして、別のモジュールを非常に簡単に置き換えることができます。
Xをインポート
してから、可能な限り X.a
を使用します。
私の例外は、Djangoのような大きなフレームワークに深くネストされたモジュールに集中しています。モジュール名は長くなる傾向があり、例はすべて django.conf import settings
から django.conf.settings.DEBUG
を入力する手間を省きます。
モジュール名が深くネストされている場合、例外は from X.Y.Z import a
を使用することです。
表記法
from some_module import some_symbol
ほとんどの場合に最適です。また、シンボルの名前が衝突する場合は、次を使用できます。
from some_module import some_symbol as other_symbol
質問が述べているように、毎回モジュール名を書き換えるのを避け、そのたびにタイプミスをするリスクがあります。構文を使用します:
import module [as other_module]
次の2つの場合のみ:
- すべてをインポートするにはモジュール関数/オブジェクトが多すぎます
- モジュールは、実行中に変更される可能性のあるシンボルを定義します
個人的には、名前空間を過度に混乱させないようにしていますので、ほとんどの場合、私はただ
import module
または modとしてモジュールをインポート
実際に違いがあるのは、よく使用される単一のクラスを持つモジュールがある場合です。関数を追加するために list
型をサブクラス化していた場合、使用します
from SuperImprovedListOverloadedWithFeatures import NewLIst
nl = NewList()
etc。
各モジュールの少数のメンバーのみを使用する傾向があるため、多くの
from john import cleese
from terry import jones, gilliam
私のコードでは。ほとんどのモジュールを使用する予定で、モジュール名が短い場合は、モジュール全体( os
や wx
など)をインポートします。また、名前の競合がある場合、またはその機能が関連付けられていることを読者に思い出させたい場合は、モジュール全体をインポートします。
import michael
import sarah
import wave
gov_speech = wave.open(sarah.palin.speechfile)
parrot_sketch = wave.open(michael.palin.justresting)
(wave_open as wave_open からを使用できますが、
wave.open
は読者にとってより馴染みのあるものと思われます。
Stack Overflowの質問に興味があるかもしれません 「import x; xy」の動作が「from x import y」と異なるのはパッケージx。 init が完了していない場合、最初のものは失敗しますか? 。
新しいバージョンのPython(2.5以降?事実を確認する必要があります...)でもできると信じています:
import some_other_module as some_module
したがって、スタイル1を使用して、後で別のモジュールに交換できます。
それは一般的に、あなたがあなたの名前空間を混乱させたい程度にマッピングすると思います。モジュールで1つまたは2つの名前を使用するだけですか?または、それらのすべて( from x import *
は、必ずしも一般的に悪いわけではありません)?