Python 3 の変数スコープとnonlocal
.
次の関数を考えてみましょう (これは単なる例です)。
def build_property(something):
def deco(func):
def getter(self):
return getattr(self, something)
def setter(self, value):
setattr(self, something, value)
return property(getter, setter)
return deco
これはなくても問題なく動作しnonlocal
ます。something
しかし、非ローカルの必要性に応じて、条件付きでゲッターとセッターを作成したい場合。
def build_property(something):
def deco(func):
nonlocal something # This is needed
if something.startswith('A'):
getter = None
else:
def getter(self):
return getattr(self, something)
if something.startswith('B'):
setter = None
else:
def setter(self, value):
setattr(self, something, value)
return property(getter, setter)
return deco
nonlocal
が必要な場合とそうでない場合があるのはなぜですか? 言い換えれsomething
ば、最初のケース ( なし) で正しく見つかったnonlocal
のに、2 番目のケースでは "UnboundLocalError: 割り当て前に参照されたローカル変数 'something'"nonlocal
が存在しない場合はなぜですか?