import logging
import typing


def function_execution_announcer_decorator(
        logger: logging.Logger) -> typing.Callable:
    """functools.wraps を使ってみたいがために作ってみたデコレータです。
    これを付与した関数の最初と最後で「処理開始」「処理終了」をアナウンス(logger.info)します。
    ロギングのためのロガーインスタンスを渡してください。

    Arguments:
        logger {logging.Logger} -- アナウンスのためのロガーインスタンス。

    Returns:
        typing.Callable -- デコレータなので関数を返します。
    """
    def _function_execution_announcer_decorator(func: typing.Callable):
        # デコレータ定義するときは functools.wraps を使います。(Effective Python で覚えた。)
        # @functools.wraps(func)
        def __function_execution_announcer_decorator(*args, **kwargs):
            logger.info('処理開始。')
            result = func(*args, **kwargs)
            logger.info('処理終了。')
            return result
        return __function_execution_announcer_decorator
    return _function_execution_announcer_decorator