Я пишу декоратор, и по разным досадным причинам [0] было бы целесообразно проверить, является ли функция, которую она обертывает, автономно или как часть класса (и, кроме того, какие классы нового класса подклассы).Python: может ли декоратор определить, определена ли функция внутри класса?
Например:
def my_decorator(f):
defined_in_class = ??
print "%r: %s" %(f, defined_in_class)
@my_decorator
def foo(): pass
class Bar(object):
@my_decorator
def bar(self): pass
Если печать:
<function foo …>: False
<function bar …>: True
Кроме того, обратите внимание:
- В точке декораторы применяются функции по-прежнему будет функция, а не несвязанный метод, поэтому тестирование для метода instance/unbound (с использованием
typeof
илиinspect
) не будет wo гк. - Пожалуйста, предлагают только предложения, которые решают эту проблему - Я знаю, что есть много подобных способов для достижения этой цели (ех, используя класс декоратора), но я хотел бы, чтобы это произошло в украшение времени, не позже.
[0]: в частности, я пишу декоратор, который упростит параметризованное тестирование с помощью nose
. Однако nose
будет не запустить тестовые генераторы на подклассах unittest.TestCase
, поэтому я хочу, чтобы мой декоратор смог определить, используется ли он в подклассе TestCase
и сбой с соответствующей ошибкой. Очевидное решение - с использованием isinstance(self, TestCase)
перед вызовом обернутой функции не работает, потому что обернутой функцией требуется, чтобы быть генератором, который не выполняется вообще.
Для любопытных, вот в результате: http://paste.pocoo.org/show/532430/ –