Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разборки с декораторами, рецепты 
:(
    Опции темы
setq
Дата 7.11.2005, 20:20 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











разбирался с декораторами. результатом "разборок" стал следующий код (взятый по приведённой ссылке и слегка модифицированный):

Код
def sig (*types) :
    def deco (f) :
        def wrap (*args) :
            assert len (args) == len (types)
            cond = [isinstance (a,t) for a,t in zip (args, types)]
            assert cond == filter (None, cond)
            return f (*args)
        return wrap
    return deco


функция sig написана специально чтобы быть декоратором. её назначение - объявлять типы параметров, принимаемых функцией. так что кто скучает по Си, можете теперь писать что-то вроде:

Код
@ sig (int, int)
def intsum (x,y) :
    return x+y


Код
>>> intsum (3,4)
7
>>> intsum (3.14,4)

Traceback (most recent call last):
  File "<pyshell#73>", line 1, in -toplevel-
    intsum (3.14,4)
  File "C:/Documents and Settings/mgurevich/Desktop/sig.py", line 6, in wrap
    assert cond == filter (None, cond)
AssertionError


с использованием sig внутри классов будут трудности, потому что в пределах объявления классы не знают своего имени.
  Вверх
setq
Дата 8.11.2005, 11:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











  Вверх
setq
Дата 14.11.2005, 15:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ок. ещё один рецепт: описание функции как рекурсивной. вводит специальное имя __f__, ссылающееся на саму функцию. если Вы считаете, что такой подход безопаснее с точки зрения редактирования кода, можете его использовать.

описание декоратора:

Код
def rec(f):
    name = isinstance(f,basestring) and f or '__f__'
    def deco(fobj):
        fobj.func_globals.update ({name:fobj})
        return fobj
    if name == '__f__':
        return deco(f)
    else:
        return deco


ИСПОЛЬЗОВАНИЕ

Код
@rec
def abc(x):
    if x>0:
        print ':)'
        __f__(x-1)  # вместо abc(x-1)


или Вас не устраивает имя __f__, можно задать своё через параметр декоратора (второй вариант той же функции):

Код
@rec('myrecf')
def abc(x):
    if x>0:
        print ':)'
        myrecf(x-1)  # вместо abc(x-1)


вызов (как обычно):

Код
>>> abc(3)
:)
:)
:)
>>> 


если я чего-то не учёл или может тут есть ошибка, скажите мне.
  Вверх
Sardar
Дата 14.11.2005, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 2
Всего: 317



[offtop]
"Какой мозгодробильный язык..." мысли в слух... smile
[/offtop]


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0648 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.