import functools def dec(func=None): if func is None: return lambda f: dec(f) @functools.wraps(func) def wrapper(*args, **kwargs): print('wrapper') return func(*args, **kwargs) return wrapper def foo1(): print('bar1') @dec def foo2(): print('bar2') @dec() def foo3(): print('bar3') foo1() foo2() foo3() print(foo1.__name__) print(foo2.__name__) print(foo3.__name__)