在mypy中记录处理程序名称注释

时间:2017-07-25 01:55:46

标签: python logging callable mypy

我正在尝试使用Python 3中的mypy来注释我的日志记录模块,但是,我在注释命名函数时遇到了问题:

import logging

def _namer(name: str) -> str:
    return name + '.gz'

def get_logger(file_name: str, level: str) -> logging.Logger:
    logger = logging.getLogger(__name__)
    handler = TimedRotatingFileHandler(file_name, backupCount=30, when='midnight')

    handler.namer = _namer
    return logger

当我运行mypy时,我将_namer分配给handler.namer:

时出现此错误
error: Incompatible types in assignment (expression has type Callable[[str], str], variable has type "Optional[Callable[[str], None]]")

知道我应该如何注释_namer以便mypy不会抱怨它吗?

1 个答案:

答案 0 :(得分:1)

看来这是mypy中的一个错误!或者更确切地说,这是Typeshed中的一个错误,它是不同类型检查器使用的各种库的类型存根的汇编,包括mypy。

在查看文档和source code of logging.handler之后,似乎handler.namer属性的类型应该是Optional[Callable[[str], str]],它与您的代码相匹配。

但是,如果我们check typeshed,我们可以看到它的类型为Optional[Callable[[str], None]]。这对我来说似乎是一个简单的疏忽。

我建议在类型化的仓库中使用修复程序进行拉取请求。在此之前,您可以通过将# type: ignore注释添加到该行的作业来使mypy静音。