python 的如何实现根据参数的不同,typing hint 不同的返回值类型?

比如对于下面这段代码:

with open(BASE_DIR/'001.txt','r') as file:
    content = file.read()

我将鼠标悬停于 read 之上,可以看到返回值是 str

图片.png

但是我们将 mode 改为 rb , read 的返回值类型就变成了 bytes

with open(BASE_DIR/'001.jpg','rb') as file:
    content = file.read()

图片.png


如果我要自己实现一个 xopen 函数,来仿写 open,要怎么实现上面的需求?

需求就是:根据参数的不同,返回值被 vscodepycharm 识别到的 typing 不同!

重点是 typing hint ,因为不能被编辑器智能提示类型的代码是毫无意义的

我不知道能不能用泛型来实现这一点,参考:Python 如何为 class 添加 Typing hint?

因为我记忆中的类型是:『根据参数的类型,来确定返回值的类型』

当我的需求是:『根据参数的值,来确定返回值的类型』

入口是 『类型』 和 『值』 的区别,泛型好像不能满足我!?

阅读 1.4k
1 个回答

自己解决了:

from typing import overload, TypeAlias, Literal

RT: TypeAlias = Literal[
    "r",
]
RB: TypeAlias = Literal[
    "rb",
]


@overload
def open(
    mode: RT = ...,
) -> str: ...


@overload
def open(
    mode: RB = ...,
) -> bytes: ...


result = open('rb')

鼠标悬停的结果:

图片.png


mode 改成 r

from typing import overload, TypeAlias, Literal

RT: TypeAlias = Literal[
    "r",
]
RB: TypeAlias = Literal[
    "rb",
]


@overload
def open(
    mode: RT = ...,
) -> str: ...


@overload
def open(
    mode: RB = ...,
) -> bytes: ...


result = open('r')

图片.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题