在下面的示例中,
Example.__init__
和
f_example
不带参数。因此,如果我尝试向他们传递一些参数,mypy 应该发出警告。但是,当我将 mypy 检查应用于以下代码时,它不会发出任何警告。我犯错了吗?
仅供参考,我还使用了 vim 和 Pyright,并且如我所料,pyright 警告这些错误。
class Example:
a: int
def __init__(self) -> None:
self.a = 0
def f_example():
return None
def test():
e = Example()
e2 = Example(1)
f_example()
f_example(1)
test()
你没有错,Mypy
应该
在你的代码中对
Example(1)
和
f_example(1)
发出错误,因为它传递的参数比
__init__
和
f_example
所期望的要多。看起来你在 Mypy 中可能遇到了一个 bug 或配置问题。
以下是可能导致此问题的一些原因和解决方法:
-
Mypy 版本: 确保你运行的是最新版本的 Mypy。旧版本可能包含导致此类行为被忽略的错误。通过运行
mypy --version
检查你的 Mypy 版本,并使用pip install --upgrade mypy
进行更新。 -
配置文件: Mypy 的行为可以通过配置文件(通常是
mypy.ini
或setup.cfg
)进行自定义。检查你的项目中是否存在配置文件,如果有,请确保它没有覆盖或禁用与参数类型检查相关的任何默认设置。有关更多信息,请参阅 Mypy 文档中的配置选项: https://mypy.readthedocs.io/en/stable/config_file.html 。 -
严格性设置: Mypy 提供了各种严格性标志,可以调整其执行类型检查的严格程度。确保没有禁用可能导致此行为的标志,例如
--disallow-untyped-calls
或--strict-optional
。你可以在命令行或配置文件中启用这些标志。 -
缓存问题: Mypy 使用缓存来提高性能。尝试使用
--no-cache
标志运行 Mypy 以禁用缓存并强制它重新检查所有文件。
如果在尝试了这些步骤后问题仍然存在,那么在 Mypy 中可能存在一个 bug。在这种情况下,请考虑在 Mypy 问题跟踪器中提交一个报告,其中包含一个最小的可重现示例: https://github.com/python/mypy/issues 。
同时,作为一种解决方法,你可以考虑使用其他类型检查器,比如 Pyright,你提到它已经正确地识别了这些错误。
标签:python,python-typing,mypy From: 72053080