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が存在しない場合はなぜですか?