我希望对一个函数进行类型注释,该函数采用默认为 str
的 AnyStr
参数,并且还返回相同的 AnyStr
类型。但是,如果我这样写:
from typing import AnyStr
def func(s: AnyStr = ".") -> AnyStr:
return s
然后 mypy 失败并显示“参数“s”的默认值不兼容(默认值类型为“str”,参数类型为“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 不会报错。
注释我的函数并使代码完全进行类型检查的正确方法是什么?
最佳答案
使用 None
作为默认值,然后在函数内部使用两个转换:一个将 None
替换为“.”转换为 Optional[AnyStr]
,并将返回值转换为 AnyStr
。
def func(s : AnyStr = None) -> AnyStr:
if s is None:
s = cast(Optional[AnyStr], ".")
return cast(AnyStr, s)
编辑:我原来的回答失败了,因为类型检查忽略了具体实现:
一种可能性是使用overload
来枚举AnyStr
涵盖的两种情况:
from typing import overload
@overload
def func(s: str = ".") -> str:
pass
@overload
def func(s: bytes) -> bytes:
pass
def func(s):
return s
关于python - 如何注释将 AnyStr 设为 str 默认值的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66279051/