如何将 mypy 与派生 类 和方法调用一起使用?
How to use mypy with derived classes and method calls?
我正在为 mypy 苦苦挣扎,不明白我想传递派生的 class,其中代码接受基础 class 或任何派生的实例 class,并调用该传递实例的方法。
我的代码:
from typing import Type
import abc
class Base(abc.ABC):
@abc.abstractmethod
def my_method(self):
pass
class Derived(Base):
def my_method(self):
print("Derived")
def my_function(b: Type[Base]):
b.my_method() # line 14
d = Derived()
my_function(d) # line 17
当我 运行 这样做时,它会打印“Derived”(正如预期的那样)。但是mypy对此并不满意:
mcve.py:14: error: Too few arguments for "my_method" of "Base"
mcve.py:17: error: Argument 1 to "my_function" has incompatible type "Derived"; expected "Type[Base]"
我假设第14行的错误是因为mypy没有看到第一个参数在方法调用的前面(base.
),这可能是因为第17行的错误?
如何让 mypy 理解这段代码?或者我在这里缺少什么?
如果您想将 Base
或 Base
的子 class 作为参数传递,则使用 Type
。您打算传递此类 class.
的 实例
def my_function(b: Base):
b.my_method()
第 14 行的错误是按字面意思理解您的类型提示,并认为您的意思是 Base.my_method(x)
而不是 x.my_method()
。
您可以简单地使用 Base
作为 b
的类型:
def my_function(b: Base):
b.my_method()
和mypy
会接受它。
我正在为 mypy 苦苦挣扎,不明白我想传递派生的 class,其中代码接受基础 class 或任何派生的实例 class,并调用该传递实例的方法。
我的代码:
from typing import Type
import abc
class Base(abc.ABC):
@abc.abstractmethod
def my_method(self):
pass
class Derived(Base):
def my_method(self):
print("Derived")
def my_function(b: Type[Base]):
b.my_method() # line 14
d = Derived()
my_function(d) # line 17
当我 运行 这样做时,它会打印“Derived”(正如预期的那样)。但是mypy对此并不满意:
mcve.py:14: error: Too few arguments for "my_method" of "Base"
mcve.py:17: error: Argument 1 to "my_function" has incompatible type "Derived"; expected "Type[Base]"
我假设第14行的错误是因为mypy没有看到第一个参数在方法调用的前面(base.
),这可能是因为第17行的错误?
如何让 mypy 理解这段代码?或者我在这里缺少什么?
Base
或 Base
的子 class 作为参数传递,则使用 Type
。您打算传递此类 class.
def my_function(b: Base):
b.my_method()
第 14 行的错误是按字面意思理解您的类型提示,并认为您的意思是 Base.my_method(x)
而不是 x.my_method()
。
您可以简单地使用 Base
作为 b
的类型:
def my_function(b: Base):
b.my_method()
和mypy
会接受它。