如何使用 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
这是我的基本代码。
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