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的正确行为还是我做错了什么。
答案 0 :(得分:0)
如注释中所述,yaml.load
将返回类型为Any
的值。这是故意的:YAML文件可以包含任意数量的内容(字典,列表...),因此类型检查器将无法推断出secret
变量的确切含义。
换句话说,在这种情况下,您的数据是合法动态的,这意味着您确实无法使用任何好的静态类型。
如果您希望mypy在您尝试从不返回<{>} 的函数返回Any
类型的内容时发出警告,请返回Any
,请使用{ {1}}标志。这会导致mypy报告一个--warn-return-any
错误。
如果您想对此更加严格,也可以使用disallow dynamic typing系列mypy标志进行探索。