0

name変数を設定するメソッドがありますがglobal name、その最初の行にはありません。ローカルname変数を使用するため、グローバル変数は変更されませんnameset_nameglobal を強制的に使用するように装飾する方法はありますnameか?

name = "John"

def set_name():
    name = "Sara"

def print_name():
    global name
    print(name)

def decorator(func):
    def wrapper(*args, **kwargs):
        ## Problem:
        # Force set_name to use global 'name'
        func(*args, **kwargs)

    return wrapper

print_name()
#Output: John

decorator(set_name)()

print_name()
# Prints John, but I want to prints Sara
4

5 に答える 5

2

いいえ、デコレーターが関数のコード (関数のコード オブジェクトからのバイトコード、または を使用したソース コードinspect) を取得し、それを変更し、変更されたコードから新しいコード オブジェクトを作成し、関数のコードをそれで置き換えない限り。もちろん、これは非常に信頼性が低く、ハッキーで、実装固有の深い黒魔術です。グローバル変数を追加するglobal name(またはグローバル変数を完全に削除する) だけです。

于 2013-11-01T17:04:59.533 に答える
2

短い答えは次のとおりです。いいえ。

少し拡張された答え: いいえ、ポータブルな方法ではありません。技術的には、CPython バイトコードをいじることはできますが、

  • 他のインタープリターでは実行されません。
  • 誰もそのコードを理解できず、
  • 頭痛はそれだけの価値はありません。
于 2013-11-01T17:05:10.623 に答える
0
name = "John" #global name

set_name() 内の名前:

name = "Sara" #local name

関数内でグローバル名を使用するにset_name()は、次のようにします。

def set_name():
   global name
   name = "Sara"
于 2013-11-01T17:09:26.107 に答える