Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么Mypy在uu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?_Python_Mypy - Fatal编程技术网

Python 为什么Mypy在uu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?

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为您提供了一个有

这里是我拥有的一个示例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为您提供了一个有用的提示,说明了为什么会发生这种情况:

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动态类型化的:

    def问候语(名称):
    返回“Hello”+name
    
    默认情况下,mypy不会对动态类型的函数进行类型检查。这意味着,除了少数例外,mypy不会使用常规的未注释Python报告任何错误

    如果要消除这些问题,请使用标志或

  • 未注参数默认为
    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
也不会触发错误。