Введение в язык Питон


Присвоение значений - часть 2


           raise BindingError, "Binding '%s' cannot be modified." % name

functional.BindingError:  Binding 'car' cannot be modified.

>>> let.car(range(10)) 0

Разумеется, реальная программа должна перехватить и обработать исключение BindingError, однако сам факт его возбуждения позволяет избежать целого класса проблем.

Помимо класса Bindings, functional

содержит функцию namespace, предоставлюющую доступ к пространству имен (на самом деле, к словарю) из экземпляра класса Bindings. Это очень удобно, если вам нужно вычислить выражение в (неизменяемом) пространстве имен, определенном в Bindings. Функция eval() в Python позволяет проводить вычисление в пространстве имен. Следующий пример поясняет сказанное:

    #----- FP-сессия Python, использующая неизменяемые пространства имен -----#

    >>> let = Bindings()      # "Real world" function names

    >>> let.r10 = range(10)

    >>> let.car = lambda lst: lst[0]

    >>> let.cdr = lambda lst: lst[1:]

    >>> eval('car(r10)+car(cdr(r10))', namespace(let))

    >>> inv = Bindings()      # "Inverted list" function names

    >>> inv.r10 = let.r10

    >>> inv.car = lambda lst: lst[-1]

    >>> inv.cdr = lambda lst: lst[:-1]

    >>> eval('car(r10)+car(cdr(r10))', namespace(inv))

    17




Начало  Назад  Вперед



Книжный магазин