Найти - Пользователи
Полная версия: Как определить что декарируем
Начало » Python для экспертов » Как определить что декарируем
1
Cleric
Как в декораторе определить что он декарирует, функцию или метод? Ведь в него всегда передаеться чистая функция, и только потом, она обертывается дексриптором, вариант со сравнением имени первого параметра с self не предлагать :)
lukke
Может через 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’>
Андрей Светлов
Cleric
Никак. Что-то я не соображу, когда это бывает нужно - и при том вариант с двумя декораторами - для свободной функции и для метода - не является лучшим.
lukke
Вы не правы. method descriptor применяется после декорирования, так что никакой разницы не будет видно. Если смотреть из декоратора, то везде - <type ‘function’>
lukke
Точно, это даже в условии написано: “Ведь в него всегда передается чистая функция”
Нельзя угадывать ответ в задаче, условие которой толком не прочитал :/
Cleric
Андрей Светлов
Что-то я не соображу, когда это бывает нужно - и при том вариант с двумя декораторами - для свободной функции и для метода - не является лучшим.
Как раз для обобщения друх декораторов мне это и нужно, дело в том что декоратор должен знать количество аргументов декарируемой функции, для методов self не должен учитываться.

Есть вариант с объявлением magic атрибута в теле класса и проверкой его в дерокаторе (sys._genframe(1).f_locals.get), но смущает неавтоматизированность этого решения, хотя это все же лучше чем два практически идентичных декоратора.
Похоже придется остановиться на этом варианте.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB