为返回参数类型的Python函数指定类型注释

时间:2020-06-02 13:34:48

标签: python dependent-type python-typing

如何正确键入以下函数的注释?

def f(cls: type) -> ???:
    return cls()

# Example usage:
assert f(int) == 0
assert f(list) == []
assert f(tuple) == ()

是否可以使用涉及??? value 而不是仅cls value 来注释Any或省略返回类型注释?如果我必须更改cls参数的类型注释,就可以了。

1 个答案:

答案 0 :(得分:3)

使用CallableTypeTypeVar的组合来表示返回类型如何与参数类型相对应:

from typing import Callable, TypeVar, Type

T = TypeVar("T")


# Alternative 1, supporting any Callable object
def f(cls: Callable[[], T]) -> T:
    return cls()

ret_f = f(int)
print(ret_f)  # It knows ret_f is an int


# Alternative 2, supporting only types
def g(cls: Type[T]) -> T:
    return cls()

ret_g = f(int)
print(ret_g)  # It knows ret_g is an int

第一种选择接受任何可调用对象;不只是创建对象的调用。


感谢@chepner的更正