python - 正确键入可以返回提供的默认值的函数

标签 python type-hinting mypy python-typing

这个问题在这里已经有了答案:





Mypy: Annotate function where return type depends on the type of an argument

(1 个回答)


23 天前关闭。




我有以下结构的功能:

def get_something_from_data(data: Mapping[str, str], default: Optional[str] = None) -> Optional[str]:
    """Get something out of `data` if it is there, if not return the value of `default`. 
    If `default` is not provided, return None.
    """
所以这可以返回 Optional[str]如果 default被省略,否则将始终返回 str如果 default有一个 str值(value)。
现在我在类似于以下的代码中调用它:
has_value = get_something_from_data(data, "fallback")
return has_value.endswith("k")
即使在这种情况下 has_value将永远是 str , 正在运行 mypy在此代码上生成错误,因为它认为 has_value可能是 None并且不会有 endswith .
所以我尝试以不同的方式输入我的函数:
DT = TypeVar('DT', str, None)

def get_something_from_data(data: Mapping[str, str], default: DT = None) -> Union[str, DT]:
    pass
这有效,但是现在当我在代码上调用 mypy 时,例如:
has_value = get_something_from_data(data)
return has_value.endswith("k")  # might fail as has_value can be None
mypy 不会抛出错误,即使代码有潜在危险。
有没有办法正确键入此函数,以便 mypy 根据是否提供默认值生成错误?

最佳答案

使用 typing.overload您可以描述函数的参数和返回类型的多种组合

from typing import overload, Mapping, Optional


@overload
def get_something_from_data(data: Mapping[str, str], default: None = None) -> Optional[str]:
    ...


@overload
def get_something_from_data(data: Mapping[str, str], default: str) -> str:
    ...


def get_something_from_data(data, default=None):
    pass

关于python - 正确键入可以返回提供的默认值的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69360198/

相关文章:

python - 我可以使用 Mypy stub 作为接口(interface)吗?

python - 在 Keras 中实现自定义卷积层 - 加载模型时出错

python - 从普通文本中分离数字和符号

python - 使用 scikit-learn 训练模型的更快方法

python - 将 pandas dataframe 列从十六进制字符串转换为 int

PHP 类型提示特征

python - 相关基类的设计模式

python - 当属性初始化为 None 然后稍后使用时出现 Mypy 错误

python - 使用 typing.Literal 的正确方法是什么?

python - 片状 8 : "multiple statements on one line (colon)" only for variable name starting with "if"