私は python @decorator を学んだばかりです。それはクールですが、すぐに変更したコードに奇妙な問題が発生することがわかりました。
def with_wrapper(param1):
def dummy_wrapper(fn):
print param1
param1 = 'new'
fn(param1)
return dummy_wrapper
def dummy():
@with_wrapper('param1')
def implementation(param2):
print param2
dummy()
デバッグすると、print param1 で例外がスローされます
UnboundLocalError: local variable 'param1' referenced before assignment
この行を削除すると param1 = 'new'
、外部スコープからの変数に対する変更操作 (新しいオブジェクトへのリンク) なしで、このルーチンが機能する可能性があります。
外側のスコープ変数のコピーを 1 つだけ作成してから変更したということですか?
Delnan に感謝します。閉鎖には不可欠です。ここからの答えの可能性: 言語 X のクロージャーと比較して、Python のクロージャーにはどのような制限がありますか?
次のようなコード:
def e(a):
def f():
print a
a = '1'
f()
e('2')
また、これは以前の迷惑なグローバル変数のようです:
a = '1'
def b():
#global a
print a
a = '2'
b()
これは、グローバルシンボルを追加することで修正されます。しかし、閉鎖のために、そのようなシンボルは見つかりませんでした。unutbu に感謝します。Python 3 はnonlocalを提供してくれました。
上記から、外部変数への直接アクセスは読み取り専用であることを知っています。しかし、先行読み取り変数 (print var) も影響を受けるのを見るのはちょっと不快です。