Python 为什么Mypy在uu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?
这里是我拥有的一个示例python文件Python 为什么Mypy在uu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?,python,mypy,Python,Mypy,这里是我拥有的一个示例python文件 班级人员: 姓名:str 年龄:整数 定义初始(自我、姓名、年龄): self.name=名称 self.age=年龄 p=人(5,5) 但是当我运行mypytest.py时,我得到以下输出 $ mypy test.py Success: no issues found in 1 source file 它是否应该抱怨它试图将5赋值给name变量,并且我已经指出该变量的类型应为str,Using为您提供了一个有
班级人员:
姓名:str
年龄:整数
定义初始(自我、姓名、年龄):
self.name=名称
self.age=年龄
p=人(5,5)
但是当我运行mypytest.py
时,我得到以下输出
$ mypy test.py
Success: no issues found in 1 source file
它是否应该抱怨它试图将5
赋值给name
变量,并且我已经指出该变量的类型应为str
,Using为您提供了一个有用的提示,说明了为什么会发生这种情况:
class Person:
name: str
age: int
def __init__(self, name, age):
self.name = name
self.age = age
reveal_type(self.name)
p = Person(5, 5)
输出:
test\u mypy1.py:8:注意:显示的类型为“Any”
test_mypy1.py:8:注意:“discover_type”总是在未选中的函数中输出“Any”
因此,原因是Mypy在默认情况下根本不会检查
\uuuu init\uuuuu
方法的类型错误,因为您没有对其进行类型注释。TLDR:注释初始化器,而不是字段:
班级人员:
定义初始(self,姓名:str,年龄:int):
self.name=名称
self.age=年龄
p=Person(5,5)#参数1到“Person”的类型不兼容“int”;预期的“str”
有关此样式的详细信息,请参见
这里有两个问题:
- MyPy不检查完全未注记的函数/方法:
MyPy:
没有类型注释的函数被认为是由mypy动态类型化的:
默认情况下,mypy不会对动态类型的函数进行类型检查。这意味着,除了少数例外,mypy不会使用常规的未注释Python报告任何错误 如果要消除这些问题,请使用标志或def问候语(名称): 返回“Hello”+name
- 未注参数默认为
:Any
即使您的class Person: name: str age: int def __init__(self, name, age: int) -> None: self.name = name reveal_type(name) # Revealed type is 'Any' reveal_type(self.name) # Revealed type is 'builtins.str' self.age = age
被选中,其参数也会采用并提供始终兼容的\uuuu init\uuuu
类型Any
若要直接解决这两个问题,请在初始化器参数而不是类槽(如果两者重合)上添加注释。只有在自动生成
\uuu init\uuuu
时才注释类槽,例如通过dataclasses.dataclass
或键入.NamedTuple
,或者如果推理不够精确,则另外注释它们。我不是用Person
类中的前两行注释吗?否,\uuuu init\uuuu
方法本身完全未选中,因为您没有为其添加类型提示。正确的键入方法是从类体中删除类型提示,并将方法签名指定为def\uuu init\uuu(self,name:str,age:int)->None:
这不仅仅是因为mypy由于缺少注释而忽略了函数。使用运行mypy——检查非类型化的defs
也不会触发错误。