web-dev-qa-db-ja.com

「モジュールスコープ」変数へのアクセス

私は現在Pythonを学んでおり、Python 2.7プロジェクトに取り組む必要があります。

モジュール自体の関数で「モジュールスコープ」変数にアクセスすることは私にとって少し混乱し、満足のいく方法を見つけることに成功しませんでした。

これまでの私の試み:

方法1:

my_module.py

my_global_var = None

def my_func():
    global my_global_var
    my_global_var = 'something_else'

ここで、ローカル変数と「モジュールスコープ」変数を混同するのは非常に簡単だと思います。

方法2:

my_module.py

import my_module

my_global_var = None

def my_func():
    my_module.my_global_var = 'something_else'

ここで、「my_module」の名前は、必要に応じて「way1」ほど簡単に変更できませんでした。さらに、モジュールをそれ自体にインポートすることは非常に奇妙に聞こえます。

あなたは何をお勧めします?それとも何か他のものを提案しますか?ありがとう。

19
Frosty Z

Pythonの名前空間 を読みたいと思うかもしれません。方法1は正しいですが、通常は不要です。2は使用しないでください。より簡単な方法は、dict(またはクラスまたはその他のオブジェクト)を使用することです。

my_globals = {'var': None}

def my_func():
    my_globals['var'] = 'something else'

割り当ては常に最も内側のスコープに入り、最も内側のスコープが常に最初に検索されるため、グローバルキーワードが必要です。この場合、名前を割り当てていないので、不要です。

25
zeekay

方法1は、絶対に必須グローバル変数を再バインドする場合の正しい方法です。ただし、グローバルを変更する理由と、実行できるより良い方法(クラスでの動作のカプセル化など)があるかどうかを自問する必要があります。

モジュールはエラーが発生しやすいため、モジュール自体へのインポートは避けてください。モジュールがスクリプトでもある場合は、代わりに__main__をインポートする必要がある場合があります。または、モジュールがパッケージの一部である場合は、foo.my_moduleをインポートする必要があります。要するに、そうしないでください。

4
Duncan

モジュールをそれ自体の中にインポートすると、望ましくない副作用が発生する可能性があります(ステートメントを複数回評価するなど)。「Way1」とpylintなどのツールを使用して、コードを検証し、一般的な方法を適用することをお勧めします。

PyLintは次の場所にあります: http://www.logilab.org/project/pylint

3
Mark Evans

グローバルの設定は一切避けてください。クラスを使用して新しい名前空間を非常に簡単に作成できるため、必要に応じてクラス変数を使用してください。

深刻な場合は、とにかくクラスを使用した適切な設計が必要です。

1
Jochen Ritzel