我希望对一个函数进行类型注解,该函数接受一个AnyStr
参数,该参数默认为str
,并且返回一个相同类型的AnyStr
。
from typing import AnyStr
def func(s: AnyStr = ".") -> AnyStr:
return s
则mypy失败,出现“Incompatible default for argument "s" (default has type "str", argument has type "bytes")
“。
我还尝试将代码拆分为.py
和.pyi
文件,如下所示:.py
文件:
def func(s = "."):
return s
.pyi
文件:
from typing import AnyStr
def func(s: AnyStr = ...) -> AnyStr:
...
...但是我一定是调用mypy错了,因为它无法对func
的调用进行类型检查;例如,如果我将func(42)
添加到.py
文件中,mypy不会抱怨。
正确的方法是什么来注解我的函数并使代码完全经过类型检查?
3条答案
按热度按时间jutyujz01#
使用
None
作为默认值,然后在函数内部使用两种类型转换:一个用于将None
替换为.“”,转换为Optional[AnyStr]
,另一个用于将返回值转换为AnyStr
。字符串
EDIT:我最初的答案失败了,因为类型检查忽略了具体的实现:
一种可能性是使用
overload
来列举AnyStr
所涵盖的两种情况:unftdfkk2#
我们讨论了这个案例here,特别是圭多的回答:
我认为这里的问题是,通常情况下,例如,如果有其他参数也在其类型中使用
_T
,则默认值将不起作用。由于这是唯一的参数,您可以说这是过度限制,如果没有参数,则返回类型应该仅由该默认值确定(在简化的示例中,您希望它返回int
),但我并不热衷于这样做,因为只要使用另一个泛型参数,它就会中断。基于该线程,您可以使用以下解决方法:
0pizxfdo3#
也许这就是你想要的: