以下のようにdecoratorを定義すると、@timerを付けたメソッドの戻り値の型がAnyになってしまい、不便。
def timer(fn) :
from time import perf_counter
def inner(*args, **kwargs):
print(f'start {fn.__name__} {CommonUtil.now_datetime_for_log()}')
CommonUtil.print_mem_usage()
start_time = perf_counter()
to_execute = fn(*args, **kwargs)
end_time = perf_counter()
execution_time = end_time - start_time
hhmmss: str = time.strftime('%H:%M:%S', time.gmtime(execution_time))
print(f'end {fn.__name__} {CommonUtil.now_datetime_for_log()}. elapsed time: {hhmmss}')
CommonUtil.print_mem_usage()
return to_execute
return inner
def timer(fn) :
を
TCallable = TypeVar("TCallable", bound=Callable)
def timer(fn: TCallable) -> TCallable:
のように変えるとちゃんと戻り値の型をチェックしてくれ、コード補完もできる。
参考: