我具有以下功能签名:
def get(key, default=None):
pass
我想将返回类型指定为默认类型,但是如果默认为None
,则应为str
:
T = TypeVar('T')
def get(key: str, default: Optional[T]=None) -> T:
pass
^这解决了第一个问题,但我不知道如何告诉linter替代返回类型应为str
而不是Any
。
我也尝试过-> Union[str, T]
,但没有运气。
按照@jonrsharpe的建议,我尝试使用@overload
装饰器:
from typing import TypeVar, overload
T = TypeVar('T')
@overload
def get(key: str, default=None) -> str: ...
@overload
def get(key: str, default: T) -> T: ...
def get(key: str, default: T=None) -> T:
if default is None:
return ''
print(key)
return 2
def main():
a = get('key')
a = get('key', None)
a = get('key', 1)
a = get('key', 1.23)
a = get('key', b'fd')
a = get('key', 'fds')
if __name__ == '__main__':
main()
但是由于default
是None
(默认情况下),因此检测到的返回类型现在是Union [str,T]。
应为def get(key: str, default: Optional[T]=None) -> T
+重载。现在一切都很好。