категории | RSS

На сайте компании ActiveState есть много рецептов для различных ЯП.
Больше всего для Python.
Я заинтересовался коллекцией рецептов Рэймонда Хеттингера.
Один из них хотелось бы сейчас рассмотреть.
==================
При написании кода приходится иметь дело с ситуацией, когда для получения необходимого результата нужно произвести цепочку вычислений, при которой промежуточный результат передаётся из одной функции в другую.
Поскольку в Python вызов функции оформляется с помощью круглых скобок, зачастую возникает нечто, что можно обозвать, переиначив известную "подколку" в сторону ЯП LISP, "мешаниной из обрезков ногтей".
===
Например:

a( b( c( d(1) 2) - 3) * 4)
В чём же заключается предложение Р.Хеттингера?
Создаётся класс-декоратор, в нём переопределяются "магические" методы для получения атрибутов(__getattr__) и вызова(__call__) экземпляров класса, которые и будут представлять "украшенные" функции.

В действительности здесь совсем немного магии fellow.
===
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))

===================
На самом деле автор выдвигает несколько другой пойнт идеи.
Но я выделил практический аспект на передний план, ибо мы люди маленькие, ни к чему нам всякие философствования.
И, конечно, помимо функций это решение применимо для любого вызываемого объекта.
===================
Пока, и да пребудут с вами Исходники.

Virtuos86
2011-05-15T13:27:12Z

Здесь находятся
всего 0. За сутки здесь было 0 человек

Комментарии 4

#4   Zaterehniy    

smile кстати я когда писал комментарий тоже вспомнил про твой скрипт. smile даешь плагин. Оказывается в глобах тег код вообще отключен.


0 ответить

#4   Virtuos86    

В связи с этим возникает вопрос: \"А не поднять ли мне свой достопамятный скрипт с форума, который я написал, когда разговор зашел о неудобности постинга кода на форуме?\". После тех разговоров и тег code успели добавить(вроде и благодаря им), но не всё гладко.
А моя-то расцвечивалка вообще рулезная winked.


0 ответить

#4   Zaterehniy    

в блогах оно некорректно отображается, не только этот тег, сам не раз натыкался....


0 ответить

#4   Virtuos86    

Блин, я уже десяток раз менял описание, не могу избавиться от code=python. Хотя когда создал, нормально отображалось.


0 ответить

Яндекс.Метрика