更改python类型提示的成员参数的类型

更改python类型提示的成员参数的类型,python,mypy,Python,Mypy,我有这样一个代码: class A: def __init__(self, a: int) -> None: self.a: int = a class B(A): def __init__(self, a: float) -> None: self.a: float = a 问题在于self.a从基类a中的int类型更改为类B中的float类型。mypy给了我以下错误: typehintancestor.py:8: error:

我有这样一个代码:

class A:
    def __init__(self, a: int) -> None:
        self.a: int = a


class B(A):
    def __init__(self, a: float) -> None:
        self.a: float = a
问题在于self.a从基类a中的int类型更改为类B中的float类型。mypy给了我以下错误:

typehintancestor.py:8: error: Incompatible types in assignment (expression has type "float", variable has type "int")
(第8行是最后一行)


这是mypy中的一个bug还是我应该更改类B的实现?

这是代码中的一个bug。假设这样定义类是合法的,我们编写了以下程序:

from typing import List

# class definitions here

def extract_int(items: List[A]) -> List[int]:
    return [item.a for item in items]

my_list: List[A] = [A(1), A(2), B(3.14)]
list_of_ints = extract_int(my_list)
我们希望
list\u of_ints
变量只包含一个int,但实际上它包含一个float


基本上,mypy是在强制您的代码遵循此处的规则。

这是代码中的一个错误。假设这样定义类是合法的,我们编写了以下程序:

from typing import List

# class definitions here

def extract_int(items: List[A]) -> List[int]:
    return [item.a for item in items]

my_list: List[A] = [A(1), A(2), B(3.14)]
list_of_ints = extract_int(my_list)
我们希望
list\u of_ints
变量只包含一个int,但实际上它包含一个float


基本上,mypy是在强制您的代码遵循此处的规则。

我认为这是mypy中的一个bug
B
可以自由地对
a
进行阴影处理和覆盖
\uuuuu init\uuuu
,就像您在这里所做的那样。如果使用
A.\uuu init\uuuuu(self,A)
,则会出现一个合法错误,该错误会试图将
浮点值
传递给一个需要
int
的函数。(我故意忽略了
mypy
super
的调用所做/应该做的事情)换句话说,
B
可能继承
a.。\uuuu init\uuuu
,但它在这里根本没有使用它。@chepner我不认为这是一个bug,重载子类(甚至是类型)的方法签名被认为是一个错误因为它打破了协方差。尽管如此,我不确定我是否同意这个结论;如果我有一个
x:List[a]
对象,我应该能够假设
x[0]。a
是一个
int
,无论
x[0]
a
的一个实例还是
a
的一个子类。我认为这是mypy中的一个bug
B
可以自由地对
a
进行阴影处理和覆盖
\uuuuu init\uuuu
,就像您在这里所做的那样。如果使用
A.\uuu init\uuuuu(self,A)
,则会出现一个合法错误,该错误会试图将
浮点值
传递给一个需要
int
的函数。(我故意忽略了
mypy
super
的调用所做/应该做的事情)换句话说,
B
可能继承
a.。\uuuu init\uuuu
,但它在这里根本没有使用它。@chepner我不认为这是一个bug,重载子类(甚至是类型)的方法签名被认为是一个错误因为它打破了协方差。尽管如此,我不确定我是否同意这个结论;如果我有一个
x:List[a]
对象,我应该能够假设
x[0]。a
int
,无论
x[0]
a
的实例还是
a
的子类。