1

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

4

2 に答える 2