Пока вы используете декоратор только для методов, они будут передаваться self
в качестве первого аргумента:
def print_timing(func):
import time
def wrapper(*args, **kwargs):
t1 = time.time()
res = func(*args, **kwargs)
t2 = time.time()
funcname = func.__name__
# Special case; a "name" instance has a "name" attribute we want to use instead.
if len(args) >= 1 and isinstance(args[0], name):
funcname = args[0].name
print '%s took %0.3f s ~ %0.0f min and %0.1f sec' % (funcname, t2-t1, int(t2 - t1)/60, (t2-t1) % 60 )
return res
return wrapper
Обновлено : Оболочка теперь использует func.__name__
по умолчанию, но если вы используете это для класса name
(как в исходном вопросе), она будет использовать атрибут name
экземпляр вместо.
Я использовал тест isinstance
, чтобы определить, присутствует ли атрибут name
, но вместо этого вы могли бы использовать типизацию с уткой (if hasattr(args[0], 'name')
); переменная name
настолько универсальна, что вы, скорее всего, получите неожиданные результаты при использовании с произвольными методами класса.