如何使用 mypy 构造子类以进行键入

How to structure subclasses with mypy for typing

假设我已经有一个 class 正确键入的文件:

#main.py

class Runner(object):
    ...
    def operation(self, arg: str) -> Runner:
        self.attrib = 'something ' + arg 
        return self
    ...

现在我想分离其中的许多 operation 方法,因为我的文件变得太大了,所以我创建了一个新文件 subs.py 并将我的代码转移到混合中:

#main.py

from subs import Mixin
class Runner(Mixin):
    ...

#subs.py

class Mixin(object):
    ...
    def operation(self, arg: str) -> Runner:
        self.attrib = 'something ' + arg 
        return self

Runner 类型对于 subs.py 是未知的,如果我导入它,那么我将创建循环导入依赖项,我什至认为它无论如何都不会起作用,所以我不确定是否正确解决这个问题的方法,在假设的情况下 :class:Mixin 被主要 class.

将方法移入 class Mixin 后,您 不会 知道 operation 会 return Runner 的实例。考虑:

class Foo(Bar, Mixin):
    ...

f = Foo()
f.operation()  # Returns something that is a Bar and a Mixin, but not a Runner.

正确的类型提示是

def operation(self, arg: str) -> Mixin:
    self.attrib = 'something ' + arg
    return self