2017-01-16 7 views
-1

Matlabでは、外部ファイルに保存されるサブ関数を呼び出すプログラムを書くことができます。そのサブ関数では、前にグローバルに定義されている限り、ローカルで宣言することなく変数を使用できます。そのような種類の動作もPythonでも可能ですか?Matlabに似たPythonの外部関数でのグローバル変数の使用

例は、何かをプロットしなければならないサブ関数です。現在、私は上記の例はtensorflowチュートリアル、tensorflowセッションのためにそうsessionスタンドから来

def plot_weights(weights,session,np,plt): 
    ... 

その関数の引数としてnumpyの(NP)とmatplotlibの(PLT)を渡しています。

それがこの

def plot_weights(weights): 
    ... 

のような関数を定義し、Pythonはいくつかのグローバル変数としてsessionnppltを取る作ることは可能ですか?

+0

['global']のようなものを探していますか(http://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-c​​reated -それら)? –

+0

あなたは*名前空間汚染*を提唱しています。この問題は、モジュールを追加することによってこれを拡大しようとすると、名前の衝突(同じ名前を使用する複数のモジュール)が発生する場合に発生します。すべてのモジュールで使用されているすべての名前を追跡しなければならず、モジュール作成者は何も変更できません。これらの名前をあなた自身のコードでも使用しないように注意する必要があります。いつ、誰が何をいつ変更したのかを知ることができないため、サポートは悪夢になります。それはまた、子猫を殺します。 – cdarke

+0

以下の答えによると、 'global'はモジュール間のグローバルを意味するものではないので、関数の引数としてすべてのオブジェクトを渡すことは実際できません。 numpyとmatplotlibの場合は、引数として渡すのではなく、サブ関数自体で少なくともインポートすることができると思いますか?しかし、このモジュールのリロードは遅くなるだろう... – mcExchange

答えて

3

私は、このパスをPythonで実行しない方が良いと思います。 sessionを別のモジュール(mと呼ぶ)に定義してから、必ずfrom m import sessionではなく、m.sessionとして参照する必要があります。

グローバル状態を取得する関数を使用する方が良い方法だと思いますが、グローバルを避けるのが一番です。

2

最初の点は、Pythonでは "グローバル"という名前がモジュールに対してグローバルにしかないということです。プロセスレベルのグローバルな名前空間は存在しません。だから、モジュールAが2つのグローバルを設定し、モジュールBから関数をインポートし、モジュールBがモジュールAのグローバルを自動的に見ているシナリオを持つことはできません(少なくとも汚いトリックに頼らないでください)。

2番目の点は、実際にはGoodThing(tm)です。グローバル状態に応じて、コードmuchyを理解するのが難しくなり、すぐに予測できない動作につながります。これは、このグローバル状態がそれに依存するコードと同じモジュールで定義され、に基づいてモジュールをスター付けしたときに、他のモジュールがプロセスのグローバル名を適切に定義しています。

また、関数の依存関係を「注入」する機能を持つことで、読みやすさと予測可能性が向上するだけでなく、ユニットテストがはるかに簡単になります。

関連する問題