首页 > 解决方案 > 仅当输入为无时,如何对 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?”

标签: pythontype-hintingmypypython-typing

解决方案


这听起来像是具有值限制的泛型用例。

下面的代码基本上说T可以是 astrNone,函数定义说“这个函数返回的类型与传入的类型相同”。

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"我认为这就是你所追求的。


推荐阅读