she*_*ron 5 python type-hinting mypy python-typing
我有以下结构的函数:
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.
"""
Run Code Online (Sandbox Code Playgroud)
因此,Optional[str]如果default省略,则可以返回,或者str如果default有str值,则始终返回。
现在我用类似于以下的代码调用它:
has_value = get_something_from_data(data, "fallback")
return has_value.endswith("k")
Run Code Online (Sandbox Code Playgroud)
即使在这种情况下始终has_value是an ,但运行此代码会生成错误,因为它认为可能是并且不会有。strmypyhas_valueNoneendswith
所以我尝试以不同的方式输入我的函数:
DT = TypeVar('DT', str, None)
def get_something_from_data(data: Mapping[str, str], default: DT = None) -> Union[str, DT]:
pass
Run Code Online (Sandbox Code Playgroud)
这是可行的,但现在当我在如下代码上调用 mypy 时:
has_value = get_something_from_data(data)
return has_value.endswith("k") # might fail as has_value can be None
Run Code Online (Sandbox Code Playgroud)
即使代码存在潜在危险,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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |