Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 4, 2007 23:38:22

Cleric
От:
Зарегистрирован: 2007-06-26
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Как определить что декарируем

Как в декораторе определить что он декарирует, функцию или метод? Ведь в него всегда передаеться чистая функция, и только потом, она обертывается дексриптором, вариант со сравнением имени первого параметра с self не предлагать :)



Офлайн

#2 Ноя. 5, 2007 00:51:23

lukke
От:
Зарегистрирован: 2007-01-01
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как определить что декарируем

Может через type() можно?


>>> class A(object):
def __init__(self):
pass
def method(self):
pass


>>> def func():
pass

>>> a = A()
>>> m = a.method
>>> f = func
>>> type(m)
<type ‘instancemethod’>
>>> type(f)
<type ‘function’>



Офлайн

#3 Ноя. 5, 2007 14:08:00

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Как определить что декарируем

Cleric
Никак. Что-то я не соображу, когда это бывает нужно - и при том вариант с двумя декораторами - для свободной функции и для метода - не является лучшим.
lukke
Вы не правы. method descriptor применяется после декорирования, так что никакой разницы не будет видно. Если смотреть из декоратора, то везде - <type ‘function’>



Офлайн

#4 Ноя. 5, 2007 17:59:35

lukke
От:
Зарегистрирован: 2007-01-01
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как определить что декарируем

Точно, это даже в условии написано: “Ведь в него всегда передается чистая функция”
Нельзя угадывать ответ в задаче, условие которой толком не прочитал :/



Отредактировано (Ноя. 5, 2007 18:00:23)

Офлайн

#5 Ноя. 6, 2007 00:07:17

Cleric
От:
Зарегистрирован: 2007-06-26
Сообщения: 87
Репутация: +  0  -
Профиль   Отправить e-mail  

Как определить что декарируем

Андрей Светлов
Что-то я не соображу, когда это бывает нужно - и при том вариант с двумя декораторами - для свободной функции и для метода - не является лучшим.
Как раз для обобщения друх декораторов мне это и нужно, дело в том что декоратор должен знать количество аргументов декарируемой функции, для методов self не должен учитываться.

Есть вариант с объявлением magic атрибута в теле класса и проверкой его в дерокаторе (sys._genframe(1).f_locals.get), но смущает неавтоматизированность этого решения, хотя это все же лучше чем два практически идентичных декоратора.
Похоже придется остановиться на этом варианте.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version