2017-01-09 11 views
0

特に、同じ名前のグローバル変数が存在する場合、Pythonはパッケージ間の呼び出しでグローバル変数を解決しますか?パッケージ間のPythonグローバル変数解決はどのように機能しますか?

たとえば、パッケージP1BaseClassが入っています。対応するBaseClassを継承するクラスDerived1およびDerived2を含む2つのパッケージP2およびP3があるとします。また、P2P3には両方ともgvarという名前の変数が含まれています(たとえば、init .pyファイルで定義されています)。

コンストラクタ内の派生クラスの両方がbaseClassコンストラクタを呼び出すと、superが呼び出されます。

BaseClassコンストラクタにgvarという参照がある場合、どうなりますか? gvar のインスタンス化中に確実に使用する方法はありますか?私の実際の生活のケース内のクラスの数十はP1P2である、と私はその定義にパッケージ固有gvarを追加する(それらすべてを変える避けたい、または他の追加:

は、なぜ私はグローバル変数で悩まていますそれと共通の祖先)。

答えて

1

グローバル単位は、モジュールあたりです。です。 P1のグローバル、P2およびP3はすべて独立しています。

Pythonの関数も、そのモジュールのグローバルマッピングへのポインタを格納するので、インポートされた場合でも、グローバルはまだ彼らはで定義されたモジュール内で検索されている。あなた例えば

、グローバルに参照することを意味していますP2.Derived1.__init__は、P2で参照され、P3.Derived2.__init__から参照されるグローバルは、P3で参照されます。どちらのパッケージもにインポートする必要があります。P1.BaseClassP1.BaseClass.__init__のグローバルはP1からのものです。

+0

私は、関数呼び出しのグローバルコンテキストが呼び出し先に渡される可能性があると考えています。したがって、 'P1.BaseClass .__ init__'は' P2.Derived1 .__ init__'で利用可能なグローバルにアクセスできますそれを呼んだ。 – Srv19

+1

@ Srv19:いいえ、それはPythonの仕組みではありません。それは信じられないほど実用的ではありません。なぜなら、必要とするコードをすべてのグローバル変数にインポートする必要があるからです。たとえば、 'argparse'モジュールは' os'、 're'、' sys'、 'textwrap'と' copy'をインポートします。もしグローバルが呼び出し元の名前空間から取られなければならない場合は、あなたのコードで 'argparse'を実行できるようにするためには、それらのモジュールもインポートする必要があります。 –

+0

私は分かりません。なぜ他のものを輸入する必要があるのですか?つまり、グローバル変数は、実行コンテキストに応じてアクセス可能でなければならず、名前をインポートせずに名前で呼び出す必要があります。動的言語なので、Cではなく、コンパイル時に明らかにする必要があります。 – Srv19

0

「グローバル」変数は、定義されているモジュール(つまり、ファイル)に対してのみグローバルです。与えられたファイルに関数(メソッドを含む)があり、その関数がグローバル変数gvarを参照している場合、そのモジュール内のグローバル変数gvarを参照し、他のモジュールでは参照しません。

ただし、モジュールの外部からグローバル変数を変更または作成することはできます。例えば、import blahを実行した後にblah.gvar = 2を実行すると、がblahの中に有効に作成されています(すでに存在する場合はその値が変更されています)。gvarを参照するblahのコードが設定した値を使用します。

関連する問題