如何指定替代返回类型以及泛型?

时间:2018-07-21 11:14:50

标签: python typing

我具有以下功能签名:

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()

但是由于defaultNone(默认情况下),因此检测到的返回类型现在是Union [str,T]。

最终编辑

应为def get(key: str, default: Optional[T]=None) -> T +重载。现在一切都很好。

0 个答案:

没有答案