python - 如何注释将 AnyStr 设为 str 默认值的函数?

标签 python python-3.x mypy python-typing

我希望对一个函数进行类型注释,该函数采用默认为 strAnyStr 参数,并且还返回相同的 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/

相关文章:

python - 如何将 intel-mkl 与 tensorflow 一起使用

python - Telebot + Celery + pytransitions : response to task

python - 无法在 Python 3.6 中导入 PyQ : flat namespace error

python - 将类型指定为数字列表(整数和/或 float )?

python - Bitly API v4 和 Python (2.7) 请求模块出现问题,我不断收到响应代码 422 : UNPROCESSABLE_ENTITY

python - 从股票数据中获取每天第一笔交易的时间

python - 我想找到一天中办公室最高峰的时间

python-3.x - PeeWee ORM 报告表已存在

python - 如何检查 Mypy `# type: ignore` 评论是否仍然有效且需要?

python - 在继承的情况下为 kwargs 输入 Mypy