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


Связывание выражений


Недовольный полурешениями, один из читателей - Ричарда Дейвис (Richard Davies) - поднял вопрос, можем ли мы целиком переместить связывания в отдельные выражения. Давайте попытаемся понять, зачем нам может этого захотеться, а также продемонстрируем замечательно элегантный способ этого добиться, предоставленный участником comp.lang.python.

Давайте сначала вспомним о классе Bindings, определенном в модуле functional. Используя свойства этого класса, мы смогли гарантировать, что отдельное имя имеет единственное значение в пределах области данного блока:

    #------- Python FP session with guarded rebinding -------#

    >>> from functional import *

          >>> let = Bindings()

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

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

          Traceback (innermost last):

            File "", line 1, in ?

            File "d:\tools\functional.py", line 976, in __setattr__

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

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

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

          0

С помощью класса Bindings нам удалось достичь желаемого результата в пределах модуля или функции, но в отношении отдельного выражения мы бессильны. Тем не менее, для семейства ML-языков вполне естественно создавать связывания в пределах отдельного выражения:

    #-------- Haskell expression-level name bindings --------#

          -- car (x:xs) = x  -- *could* create module-level binding

          list_of_list = [[1,2,3],[4,5,6],[7,8,9]]

          -- 'where' clause for expression-level binding



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



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