如何正确键入以下函数的注释?
def f(cls: type) -> ???:
return cls()
# Example usage:
assert f(int) == 0
assert f(list) == []
assert f(tuple) == ()
是否可以使用涉及???
的 value 而不是仅cls
的 value 来注释Any
或省略返回类型注释?如果我必须更改cls
参数的类型注释,就可以了。
答案 0 :(得分:3)
使用Callable
或Type
和TypeVar
的组合来表示返回类型如何与参数类型相对应:
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的更正