【问题标题】:how to use type hint in python to perform that a method returns exactly its parameter如何在 python 中使用类型提示来执行方法准确返回其参数
【发布时间】:2017-01-07 09:50:55
【问题描述】:

这是我的基本代码。

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],但我想要返回的参数是self,即BState。这在 Python 的类型系统中可用吗?

【问题讨论】:

    标签: python-3.5 type-hinting


    【解决方案1】:

    如果您希望函数始终返回与其参数完全相同的类型,您可以通过 TypeVars 类使用泛型:

    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) 的意思是“创建一个名为TState 的新通用参数,它必须始终是State 对象的子类。”但是,由于尚未定义 State 类,我们需要使用前向引用并将绑定是字符串而不是类名:TState = TypeVar('TState', bound='State')

    您也可以使用TState = TypeVar('TState'),这意味着“创建一个名为TState 的新通用参数,它可以是任何东西”,但这可能不是您想要的,所以我不推荐它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      相关资源
      最近更新 更多