Python: может ли декоратор определить, определяется ли функция внутри класса?

Я пишу декоратор, и по разным досадным причинам [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

Также обратите внимание:

  • В декораторах точки применяются, функция по-прежнему будет функцией, а не несвязанным методом, поэтому тестирование для экземпляра / несвязанного метода (с использованием typeof или inspect ) не будет работать.
  • Пожалуйста, предлагайте только предложения, которые решают эту проблему - я знаю, что есть много похожих способов для достижения этой цели (например, с использованием декоратора классов), но я бы Я бы хотел, чтобы они произошли во время украшения , а не позже.

[0]: в частности, я пишу декоратор, который упростит параметризованное тестирование с носом . Однако нос не будет не запускать генераторы тестов в подклассах unittest.TestCase , поэтому я хотел бы, чтобы мой декоратор мог определить, используется ли он внутри подкласс TestCase и завершится ошибкой с соответствующей ошибкой.Очевидное решение - использование isinstance (self, TestCase) перед вызовом обернутой функции не работает, потому что обернутая функция требует, чтобы был генератором, который не запускается и вовсе .

14
задан David Wolever 9 January 2012 в 20:23
поделиться