2

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

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 不会抱怨吗?

4

1 回答 1

3

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

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

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

我建议在 typeshed 存储库中提出带有修复的请求。# type: ignore在此之前,您可以通过将注释添加到该行的作业来使 mypy 静音。

于 2017-07-25T18:18:12.010 回答