Mypy无法捕获类型mysmatch

时间:2019-09-10 13:39:59

标签: python mypy

mypy == 0.720

我的文件:

import yaml


def read_secret_yaml() -> str: # Real return type is dict.
    """
    Read secret.yaml (not added to Git).
    """
    current_dir = os.path.dirname(os.path.realpath(__file__))
    path = os.path.join(current_dir, "../../doc/secret.yaml")
    stream = open(path, "r")
    secret = yaml.load(stream, Loader=yaml.FullLoader)

    return secret

此函数返回一个字典。我有意将结果类型tytpe更改为str,以检查mypy是否捕获了此类型mysmatch。

命令是:

mypy --strict-optional general_lib.py

我没有收到错误消息。

您能告诉我这是mypy的正确行为还是我做错了什么。

1 个答案:

答案 0 :(得分:0)

如注释中所述,yaml.load将返回类型为Any的值。这是故意的:YAML文件可以包含任意数量的内容(字典,列表...),因此类型检查器将无法推断出secret变量的确切含义。

换句话说,在这种情况下,您的数据是合法动态的,这意味着您确实无法使用任何好的静态类型。


如果您希望mypy在您尝试从不返回<{>} 的函数返回Any类型的内容时发出警告,请返回Any,请使用{ {1}}标志。这会导致mypy报告一个--warn-return-any错误。

如果您想对此更加严格,也可以使用disallow dynamic typing系列mypy标志进行探索。