Я пишу декоратора, и по разным досадным причинам [0] было бы целесообразно проверить, является ли функция, которую она обертывает, автономно или как часть класса (и далее, какие классы нового класса является подклассом).
Например:
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
) не будет работать. - Пожалуйста, предлагайте только предложения, которые решают эту проблему. Я знаю, что существует много подобных способов достижения этой цели (например, с использованием декоратора класса), но я бы хотел, чтобы они произошли во время украшения, а не позже.
[0]: в частности, я пишу декоратор, который упростит параметризованное тестирование с помощью nose
. Однако nose
не будет запускать генераторы тестов в подклассах unittest.TestCase
, поэтому я хочу, чтобы мой декоратор смог определить, используется ли он в подклассе TestCase
и сбой с соответствующей ошибкой. Очевидное решение - с помощью isinstance(self, TestCase)
перед вызовом обернутой функции не работает, потому что обернутая функция должна быть генератором, который вообще не выполняется.