На сайте компании ActiveState есть много рецептов для различных ЯП.
Больше всего для Python.
Я заинтересовался коллекцией рецептов Рэймонда Хеттингера.
Один из них хотелось бы сейчас рассмотреть.
==================
При написании кода приходится иметь дело с ситуацией, когда для получения необходимого результата нужно произвести цепочку вычислений, при которой промежуточный результат передаётся из одной функции в другую.
Поскольку в Python вызов функции оформляется с помощью круглых скобок, зачастую возникает нечто, что можно обозвать, переиначив известную "подколку" в сторону ЯП LISP, "мешаниной из обрезков ногтей".
===
Например:
a( b( c( d(1) 2) - 3) * 4)
В чём же заключается предложение Р.Хеттингера?
Создаётся класс-декоратор, в нём переопределяются "магические" методы для получения атрибутов(__getattr__) и вызова(__call__) экземпляров класса, которые и будут представлять "украшенные" функции.
В действительности здесь совсем немного магии .
===
class CF(object):
. 'Decorator for creating a composable function'
def __init__(self, f):
. . self.func = f
def __call__(self, x):
. return self.func(x)
def __getattr__(self, other):
. other = globals()[other]
return CF(lambda x: self(other(x)))
#-------- Example ----------
class CF(object):
. 'Decorator for creating a composable function'
def __init__(self, f):
. . self.func = f
def __call__(self, x):
. return self.func(x)
def __getattr__(self, other):
. other = globals()[other]
return CF(lambda x: self(other(x)))
#-------- Example ----------
@CF
def f(x):
. return 3 * x
@CF
def g(x):
. return x + 10
print (f.g)(2) # same as f(g(2))
===================
На самом деле автор выдвигает несколько другой пойнт идеи.
Но я выделил практический аспект на передний план, ибо мы люди маленькие, ни к чему нам всякие философствования.
И, конечно, помимо функций это решение применимо для любого вызываемого объекта.
===================
Пока, и да пребудут с вами Исходники.
Здесь находятся
всего 0. За сутки здесь было 0 человек
Комментарии 4
В связи с этим возникает вопрос: \"А не поднять ли мне свой достопамятный скрипт с форума, который я написал, когда разговор зашел о неудобности постинга кода на форуме?\". После тех разговоров и тег code успели добавить(вроде и благодаря им), но не всё гладко.
А моя-то расцвечивалка вообще рулезная .
в блогах оно некорректно отображается, не только этот тег, сам не раз натыкался....
0 ответить