2012-04-28 12 views
5

をインポートします。私は名前空間の汚染に寄与しているのではないかと心配しています。同じファイルにこのような小さなスニペットがいくつかあるからです。制限範囲は、私はこのようになりますいくつかのコードを持っている

この状況を処理するPythonicの方法は何ですか?私はまだちょっと遊んでいるので、何度も書いたり書き換えたりしないでください。pyparsing.何度も書きます。

答えて

7

一つの簡単な方法は、ファイル内のインポートの可視性を制御するための関数スコープを使用することです:

def prepare_parser(): 
    from pyparsing import Word, alphas, Optional, ... 
    # do stuff, and get the final thing to return 
    return ... 

parser = prepare_parser() 
+3

このテクニックは簡単に実行できますが、一般的ではなく、関数を使用してグローバルスコープからインポートを隠すという慣習では、多くの開発者が戸惑うでしょう。一言で言えば、これは推奨される方法であるとは思わない。関数内にインポートを置くことは通常、インポートを遅らせる必要があります(モジュールがロードされているときではなく、関数が呼び出されたときにインポートを行う)。私はこれを指摘しています。なぜなら、OPはPythonのプラクティスを求めているからです。輸入をローカライズせずに仕事を終わらせるテクニックがあります。 –

+2

@RaymondHettinger私の印象は、大半の開発者がグローバルスコープからのインポートを隠すことを単に気にしないということです。 (ほとんどの場合、名前空間の余分な値を扱うか、モジュールをインポートして ''表記を使用します。 – Amber

+2

実際には、ユーザーが '' help(yourmodule ) ''や '' dir(yourmodule) ''を使ってAPIを発見することができます。これらのAPI発見技術の両方は、名前空間の混乱によって損なわれる。 –

11

名前空間の汚染を制御するために、通常の方法

  1. は使用
  2. 使用後の変数を削除しています__all__変数
  3. 下線付き変数名にimport-asを使用

これらの手法は、すべて標準ライブラリのコア開発者が使用します。例えば、小数モジュール:

  • その後、それはセットアップにdel sys, MockThreadingを使用してvariable deletion続いスレッド環境で作業し、そのようなimport math as _mathなどprivate name importsなどで始まります。

  • さらに、公開APIが何であるかを明確にすることはdefines an __all__ variableです。

これらの技術を組み合わせると、ネームスペースはホイッスルのようにクリーンな状態に保たれます。

関連する問題