0

それは明らかにうまくいきます:

def test_A():
    magic = str(uuid.uuid4())

    def handler(request):
        return magic

    assert handler(0) == magic

これは「割り当て前に参照されたローカル変数」で失敗しますが、

def test_A():
    magic = str(uuid.uuid4())

    def handler(request):
        magic = magic
        return magic

    assert handler(0) == magic

2 番目のスニペットでは、それmagicがローカル変数になり、上のスコープの変数とは独立して操作されると仮定します。

グローバル変数を変更するには として宣言する必要があることはわかってglobalいますが、ここでやりたいことは、偶然にも同じ名前の独立したローカル変数を作成することです。これはまったく不可能で、ローカル変数に別の名前を選択する必要がありますか?

4

3 に答える 3

1

handler()スタックの 1 レベル前に到達し、呼び出し元のローカル変数を同じ名前で取得できます。

def test_A():
    magic = str(uuid.uuid4())

    def handler(request):
        magic = sys._getframe(1).f_locals['magic']
        return magic

    assert handler(0) == magic
于 2012-10-03T14:27:25.797 に答える
0

一般に、グローバル変数とローカル変数を同じ名前で呼び出すことは非常に悪い習慣です。これらがクラス内にある場合は、スコープをより簡単に指定できます。

ただし、globals() 関数を使用してグローバル変数にアクセスできます。この関数は、グローバルを含む辞書を返すため、次のようになります。

magic=globals()['magic']
于 2012-10-03T12:58:43.503 に答える
0

一定のままである場合test_A.magic、その値を使用して、デフォルト値でキーワード引数を定義できます。

def test_A():
    magic = str(uuid.uuid4())

    def handler(request, magic = magic):
        # magic here will be a local variable, whose
        # default value will be set to the value of test_A.magic 
        # at the time the def handler statement was parsed.
        return magic

    assert handler(0) == magic    
于 2012-10-03T12:57:19.600 に答える