正确键入可以 return 提供的默认值的函数
Correctly typing a function that can return a provided default value
我有一个结构如下的函数:
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.
"""
所以这可以 return 要么 Optional[str]
如果 default
被省略,或者总是 return str
如果 default
有一个 str
值。
现在我在类似于以下的代码中调用它:
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 您可以描述函数的参数和 return 类型的多种组合
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
我有一个结构如下的函数:
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.
"""
所以这可以 return 要么 Optional[str]
如果 default
被省略,或者总是 return str
如果 default
有一个 str
值。
现在我在类似于以下的代码中调用它:
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 您可以描述函数的参数和 return 类型的多种组合
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