更改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中的一个bugB
可以自由地对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
的子类。