python - 仅当输入为无时,如何对 Python 函数进行类型注释以将其标记为返回无?
问题描述
在我们的代码中有一个典型的数据转换模式:当值为 None 时,我们让它通过。例如,
def capitalize(value):
if value is None:
return None
return value.capitalize()
# usage example:
assert capitalize(None) is None
assert capitalize("hello world") == "Hello world"
我可以这样注释它:
from typing import Optional
def capitalize(value: Optional[str]) -> Optional[str]:
if value is None:
return None
return value.capitalize()
看起来不错,但是下面的代码
capitalize("Hello world").split()
总是会让 mypy 抱怨。
error: Item "None" of "Optional[str]" has no attribute "split"
有没有办法用类型注释来表达转换规则“None总是转换为None,而str总是转换为str?”
解决方案
这听起来像是具有值限制的泛型用例。
下面的代码基本上说T
可以是 astr
或None
,函数定义说“这个函数返回的类型与传入的类型相同”。
from typing import TypeVar
T = TypeVar("T", str, None)
def capitalize(value: T) -> T:
if value is None:
return None
return value.capitalize()
capitalize("Hello world").split()
在上面的代码上运行mypy
似乎工作正常,并且:
capitalize(None).split()
mypy
抱怨的原因:error: "None" has no attribute "split"
我认为这就是你所追求的。
推荐阅读
- java - 特定项目没有控制台输出 - Java Eclipse
- python - 如何封装将控制台打印到 Word 的方法
- powershell - 脚本作为本地系统运行时的额外字符
- reporting-services - 在 SSRS 报告表中,有没有办法拥有两组重复组?
- go - WebsocketServer:向连接的客户端发送事件消息
- string-concatenation - 可以在 ArnoldC 中连接整数和字符串吗?
- javascript - 如何在此表中添加特定的 OnClick 侦听器?
- plsql - Oracle APEX - 语言更改时查询中缺少列
- javascript - VUE.JS/HTTP。使用 vue.js 将 http 查询结果获取到 html 的问题
- angular - 如何在需要时跳过组件?