銀月の符号

Python 使い見習いの日記・雑記

Python レシピ追加、変数と定数

「003:変数と定数」を追加。

役に立たない文章の予感。言語仕様を知るにはこんなのより原典(http://docs.python.org/reference/executionmodel.html#naming-and-binding)ソースコードにあたるべきだから。

書いた際に自分の復習になったのはたしかだけれども。

nonlocal

これを書いていた際に思い出したのでメモ。 Python 3 から使えるようになった新顔の「文」、 nonlocal。

関数がネストしているとき、内の関数ブロックから外の関数ブロックの変数へ代入を可能とする。もうクロージャ書きにくいとか言われない、かも? でも、こんなものを導入しないといけなかったなんて Python の設計はダメなんじゃないか? といわれる、かも?

def count(n=0):
    counter = n

    def _():
        nonlocal counter
        counter += 1
        return counter

    return _
>>> a = count()
>>> a()
1
>>> a()
2
>>> a()
3

2009/12/9 追記

自分のつたない文、コードらを doloop さんに編集していただきました。ありがとうございます。

old
class ConstAttr(object):
    def __setattr__(self, name, value):
        if name in self.__dict__:
            raise TypeError("Don't rebind %s" % name)
        self.__dict__[name] = value

    def __delattr__(self, name):
        if name in self.__dict__:
            raise TypeError("Don't unbind %s" % name)
        raise NameError(name)
new
class ConstAttr(object):
    def __setattr__(self, name, value):
        if hasattr(self, name):
            raise AttributeError("Don't rebind %s" % name)
        object.__setattr__(self, name, value)

    def __delattr__(self, name):
        if hasattr(self, name):
            raise AttributeError("Don't unbind %s" % name)
        object.__delattr__(self, name)

__dict__ を持ち出すのはまだ早い、hasattr , object.__setattr__ や object.__delattr__ で十分、と。なるほど、納得。