类型做出positive个promise --它们指定对象can do的事情.不是对象can't所做的事情.
如果您有一个静态类型float
的对象,则您知道该对象支持__int__
,因此您知道它是类型SupportsInt
的成员.
如果您有静态类型object
的对象,则object
没有__int__
方法,但this object仍然可能支持__int__
.该对象可以是一个float,也可以是支持__int__
的object
的其他子类的实例.您don't know是否将其传递给to_int
都会返回int.
您的第二个超载是试图说"不支持__int__
?然后返回原始类型."它should说的是"不知道它是否支持__int__
?然后可能返回原始类型,或者可能返回int
."您可以使用无界类型变量和联合返回类型来实现这一点,就像这样:
from typing import overload, SupportsInt, TypeVar
T = TypeVar('T')
@overload
def to_int(value: SupportsInt) -> int: ...
@overload
def to_int(value: str) -> int: ...
@overload
def to_int(value: T) -> T | int: ...
def to_int(value):
try:
return int(value)
except TypeError:
return value
请注意,我还为str
添加了一个单独的过载.str
实际上不支持__int__
,因此它不属于SupportsInt
过载范围-像int('35')
这样的呼叫由int.__new__
中的特殊情况处理.
当然,有时您会遇到类似to_int([])
的情况,其中您知道对象的具体具体类型,并且您know int
调用将会失败.但类型系统不会以更具体的注释发挥作用所需的方式传播该信息.对于类型判断器来说,list
的实例可能是某个奇怪的支持__int__
的list
子集的实例,即使查看代码的人可以看出它不是.