私は現在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」ほど簡単に変更できませんでした。さらに、モジュールをそれ自体にインポートすることは非常に奇妙に聞こえます。
あなたは何をお勧めします?それとも何か他のものを提案しますか?ありがとう。
Pythonの名前空間 を読みたいと思うかもしれません。方法1は正しいですが、通常は不要です。2は使用しないでください。より簡単な方法は、dict(またはクラスまたはその他のオブジェクト)を使用することです。
my_globals = {'var': None}
def my_func():
my_globals['var'] = 'something else'
割り当ては常に最も内側のスコープに入り、最も内側のスコープが常に最初に検索されるため、グローバルキーワードが必要です。この場合、名前を割り当てていないので、不要です。
方法1は、絶対に必須グローバル変数を再バインドする場合の正しい方法です。ただし、グローバルを変更する理由と、実行できるより良い方法(クラスでの動作のカプセル化など)があるかどうかを自問する必要があります。
モジュールはエラーが発生しやすいため、モジュール自体へのインポートは避けてください。モジュールがスクリプトでもある場合は、代わりに__main__
をインポートする必要がある場合があります。または、モジュールがパッケージの一部である場合は、foo.my_module
をインポートする必要があります。要するに、そうしないでください。
モジュールをそれ自体の中にインポートすると、望ましくない副作用が発生する可能性があります(ステートメントを複数回評価するなど)。「Way1」とpylintなどのツールを使用して、コードを検証し、一般的な方法を適用することをお勧めします。
PyLintは次の場所にあります: http://www.logilab.org/project/pylint
グローバルの設定は一切避けてください。クラスを使用して新しい名前空間を非常に簡単に作成できるため、必要に応じてクラス変数を使用してください。
深刻な場合は、とにかくクラスを使用した適切な設計が必要です。