Декоратор функций Python должен печатать полное имя метода

Следующий полезный декоратор измеряет время выполнения функции. Он также печатает имя функции. Однако было бы здорово, если бы он также мог печатать имя класса, если функция является методом. Как кратко получить полное имя метода а-ля Class.method?

import time

def timeit(f):

    def timed(*args, **kw):

        ts = time.time()
        result = f(*args, **kw)
        te = time.time()

        print('func:%r args:[%r, %r] took: %2.4f sec' % (f.__name__, args, kw, te-ts))
        return result

    return timed

person clstaudt    schedule 03.11.2016    source источник


Ответы (2)


А как насчет .__qualname__ ?

In [1]: class MyClass(object):
   ...:     def my_method(self):
   ...:         pass
   ...:

In [2]: MyClass.my_method.__qualname__
Out[2]: 'MyClass.my_method'
person Guillaume    schedule 03.11.2016
comment
полезный! но доступно только с Python 3.3 docs.python.org/ 3.6/библиотека/ - person Tryph; 03.11.2016

Может быть лучший способ, но в Python 2 (в котором нет __qualname__) вы можете использовать

m.im_class.__name__

as in

>>> class MyClass(object):
...   def foo(self):
...      pass
... 
>>> m = MyClass.foo
>>> print m.im_class.__name__ + '.' + m.__name__
MyClass.foo
person khelwood    schedule 03.11.2016