如何使用 python 中的类型提示来准确执行方法 returns 的参数

how to use type hint in python to perform that a method returns exactly its parameter

这是我的基本代码。

from typing import Optional


class State:
    name = 'unnamed state'

    def __init__(self, name: str = None) -> None:
        super().__init__()

        if name is not None:
            self.name = name

    def on_enter(self) -> None:
        pass

    def on_leave(self) -> None:
        pass

    def to(self, dest: Optional['State']) -> Optional['State']:
        self.on_leave()
        if dest is not None:
            dest.on_leave()
        return dest


class AState(State):
    pass


class BState(State):
    def b_func(self):
        pass


a = AState()
b = BState()

a.to(b).b_func()

目前类型提示显示a.to(b)的类型是Optional[State],但我想要的是return参数是self,即BState。这在 Python 的类型系统中可用吗?

如果您希望函数始终 return 与其参数的类型完全相同,您可以通过 TypeVars class:

使用泛型
from typing import Optional, TypeVar

# Note that "TState" is an arbitrary name.
TState = TypeVar('TState', bound='State')

class State:
    name = 'unnamed state'

    def __init__(self, name: str = None) -> None:
        super().__init__()

        if name is not None:
            self.name = name

    def on_enter(self) -> None:
        pass

    def on_leave(self) -> None:
        pass

    def to(self, dest: Optional[TState]) -> Optional[TState]:
        self.on_leave()
        if dest is not None:
            dest.on_leave()
        return dest


class AState(State):
    pass


class BState(State):
    def b_func(self):
        pass


a = AState()
b = BState()

a.to(b).b_func()

表达式 TState = TypeVar('TState', bound=State) 表示 "create a new generic parameter named TState which must always be a subclass of a State object." 但是,由于 State class 尚未定义,我们需要使用前向引用并将绑定设为一个字符串而不是 class 名称:TState = TypeVar('TState', bound='State').

你也可以做 TState = TypeVar('TState'),这意味着 "create a new generic parameter named TState which can be anything",但这可能不是你想要的,所以我不推荐它。

您可以在此处了解有关 TypeVars 上限的更多信息:http://mypy.readthedocs.io/en/latest/generics.html#type-variables-with-upper-bounds