1

Python のスコープ ルールについてはよくわかりません。Python コンソールを使用して変数を定義し、モジュールをインポートしてそのモジュールで関数を呼び出す場合、関数内で変数を参照する方法はありますか? 例えば:

>> option = 2
>> import choosingModule
>> choosingModule.choosingFunction()

そして、選択モジュールで:

def choosingFunction():
    if option == 0:
        doThis()
    elif option == 1:
        doThat()
    elif option == 2:
        doTheOtherOne()
    else:
        doWhateverYouFeelLike()

明らかにそれは単純な例です。これを行う理由は、関数の 4 つの異なるバージョンがあり、コンソールからどれを使用するかを選択できるようにしたいからです。関数はコードのかなり深いところで呼び出されるため、特にテスト段階でのみ比較する必要があるため、すべての関数呼び出しでパラメーターを渡す必要はありません。これが製品版になると、そのうちの 1 つだけが使用されます。

では、呼び出された関数で Python コンソール変数を参照する方法はありますか? それとも、私が必要とすることを行うための他の方法がありますか?

4

2 に答える 2

2

REPL を実行すると、あなたが__main__モジュールになるので、それをインポートしてそこから変数を使用できます。

def choosingFunction():
    option = __import__('__main__').option
    if option == 0:
        doThis()
    elif option == 1:
        doThat()
    elif option == 2:
        doTheOtherOne()
    else:
        doWhateverYouFeelLike()

ただし、変数をコンソールで定義する必要がまったくない場合は、 on に設定することをお勧めしますchoosingModule。それで:

def choosingFunction():
    global option
    if option == 0:
        doThis()
    elif option == 1:
        doThat()
    elif option == 2:
        doTheOtherOne()
    else:
        doWhateverYouFeelLike()
>>> import choosingModule
>>> choosingModule.option = 2
>>> choosingModule.choosingFunction()

ただし、テスト中にのみ使用する必要があります。これらを本番コードで使用しないでください。

于 2012-04-20T04:12:25.410 に答える
0

その変数をグローバル スコープに保持し、globalステートメントを使用してアクセスすることをお勧めします。

globalキーワードを使用すると、関数の呼び出し元に同じ名前の別の変数が存在する場合でも、グローバル名前空間内の変数を参照できます。

例: これは "tangerine" を出力します。

def foo():
    def bar():
        return fruit
    fruit = "tangerine"
    return bar2()

fruit = "banana"
print(foo()) # will print "tangerine"

しかし、これは「バナナ」を出力します。

def foo2():
    def bar2():
        global fruit # fetch me the fruit in the global scope
        return fruit
    fruit = "tangerine"
    return bar2()

fruit = "banana"
print(foo2()) # will print "banana"

global キーワードがない場合、インタープリターは参照しようとしている変数を見つけるために「LEGB ルール」に従います。

  1. ローカルスコープ: まず、関数ステートメントが実行されているスコープであるローカル スコープで変数を検索します。ローカル スコープは、関数が呼び出されるたびに作成されます。
  2. エンクロージング スコープ: 次に、インタープリターは「エンクロージング関数ローカル」で変数を探します。これは、関数が挿入される (宣言される) 関数です。これは、bar()内のreturn fruitステートメントでfruit変数が見つかる場所です。
  3. G lobal: 上記の名前空間で変数が見つからない場合、Python はグローバル変数の中からそれを見つけようとします。globalステートメントを使用すると、Python はグローバル スコープでのみ検索するようになり、1 と 2 はスキップされます。
  4. B uiltins: 最後に、Python は組み込み関数と定数の中から変数を見つけようとします。ここには魔法はありません。

上記のすべての検索で変数名が見つからない場合、Python はNameError例外を発生させます。

$ NameError: name 'fruit' is not defined

次に、次のことができます。

def choosingFunction():
    global option
    if option == 0:
        doThis()
    elif option == 1:
        doThat()
    elif option == 2:
        doTheOtherOne()
    else:
        doWhateverYouFeelLike()

>> option = 2
>> import choosingModule
>> choosingModule.choosingFunction()

あなたのものを呼び出しているモジュール内のグローバル変数の存在に依存することは非常に悪い習慣と見なされ、深刻なことには使用してはならないことに注意してください。;)

globalステートメントの詳細については、次のドキュメントを確認してください: Python 3.xおよびPython 2.7。スコープと名前空間のルールについては、こちら (Python 3.x) またはこちら (Python 2.7) を確認ください

于 2012-04-20T05:01:11.057 に答える