Python 为什么当mypy需要类型注释时,愚蠢的注释会处理错误?

Python 为什么当mypy需要类型注释时,愚蠢的注释会处理错误?,python,annotations,typing,mypy,Python,Annotations,Typing,Mypy,Mypy在此行上出错: response = {'available_fields': []} error: Need type annotation for 'response' 当我添加愚蠢的注释,即响应是dict时,错误消失: response: typing.Dict = {'available_fields': []} 所以,我有一些问题。为什么愚蠢的注释处理错误?如何调优mypy(配置、选项等),而不用担心这行没有注释 问题是mypy不知道您的列表应该包含什么。是字符串列表吗?

Mypy在此行上出错:

response = {'available_fields': []}

error: Need type annotation for 'response'
当我添加愚蠢的注释,即响应是dict时,错误消失:

response: typing.Dict = {'available_fields': []}

所以,我有一些问题。为什么愚蠢的注释处理错误?如何调优mypy(配置、选项等),而不用担心这行没有注释

问题是mypy不知道您的列表应该包含什么。是字符串列表吗?INT列表?还有别的吗

当你做一些像

response: Dict = {'foo': []}
…mypy将使用自动填充dict缺少的类型参数。因此,上述声明完全等同于:

response: Dict[Any, Any] = {'foo': []}
也就是说,键可以是任何东西(不仅仅是字符串),值也可以是任何东西(不仅仅是列表)


在您的情况下,您可能应该(a)在注释中填写预期的键和值类型:

# For example:
response: Dict[str, List[str]] = {'foo': []}
…或(b),如果您的口述更复杂,请使用



如果希望mypy不允许您省略泛型类型中的参数(例如,禁止仅执行
响应:Dict=…
),请使用。如果您不想在每次运行mypy时都键入标志,也可以将此选项添加到。是否有一个选项可以在不带注释的行上抑制mypy错误?最好是在配置文件中。我希望行
response={'available_fields':[]}
对mypy有效,而不需要对源代码进行任何修改。@如果var是在全局范围内声明的,请使用
--allow untyped globals
标志/config选项。如果它是在函数内部定义的,那么最好的方法可能是从该函数的参数中删除所有类型提示(使其成为动态类型),或者通过在该行中添加一个来抑制错误。请注意,这些选项都不能使该行“有效”——相反,它们更像是使mypy在检测类型错误时不那么准确的机制。也就是说,我个人建议尽可能添加准确的注释/谨慎使用这些选项。mypy的全部目的是尝试并利用类型推断来检测尽可能多的错误,并且为了做到这一点,您有时需要为无法推断特定类型的情况提供mypy提示。降低mypy的准确性有时是必要的(特别是在将大型代码库迁移到使用类型时),但应尽可能避免。