如何使用另一个函数的 return 类型来注释 Python 函数?
How to annotate Python function using return type of another function?
我正在寻找 C++ 中 decltype 的一些类似物。我想要完成的是以下内容:
def f(a: int) -> List[Tuple(int, float)]
def g(a: List[int]) -> List[decltype(f)]
所以想法是使用另一个函数的类型注释。
我找到的解决方案看起来有些笨拙:
def g(a: List[int])->f.__annotations__['return']
基本上,问题是是否存在类似 decltype 的东西(也许应该称为 "return_type"),或者是否计划在进一步的版本中使用。我还编写了一个小函数来说明此功能的可能用法:
def return_type(f: Callable):
try:
return get_type_hints(f)['return']
except(KeyError, AttributeError):
return Any
def g() -> return_type(f):
UPD 正如 Jim Fasarakis-Hilliard 所建议的,我们也可以使用 get_type_hints 而不是 注释
当前 不存在,the tracker for typing 上没有问题似乎表明它已在计划中。随时欢迎您创建一个问题,看看这是如何受到欢迎的。
目前您的方法可以解决问题(即分配类型),我要介绍的唯一更改是使用 typing
中的 get_type_hints
而不是获取 __annotations__
直接属性。结合 .get
(因为它 return 是一个字典),也可以使它更短:
def return_type(f):
return get_type_hints(f).get('return', Any)
def g() -> return_type(f):
如果您愿意,当然可以将其从函数中删除并在一行中使用。
如果存在向 return_type
提供随机对象的可能性,您将需要捕获它引发的 TypeError
和 return 您的默认值 Any
:
def return_type(f):
try:
return get_type_hints(f).get('return', Any)
except TypeError:
return Any
当然,由于这是动态分配类型,因此您不能指望静态类型检查器能够捕捉到它,您需要对此进行静态提示。
我正在寻找 C++ 中 decltype 的一些类似物。我想要完成的是以下内容:
def f(a: int) -> List[Tuple(int, float)]
def g(a: List[int]) -> List[decltype(f)]
所以想法是使用另一个函数的类型注释。 我找到的解决方案看起来有些笨拙:
def g(a: List[int])->f.__annotations__['return']
基本上,问题是是否存在类似 decltype 的东西(也许应该称为 "return_type"),或者是否计划在进一步的版本中使用。我还编写了一个小函数来说明此功能的可能用法:
def return_type(f: Callable):
try:
return get_type_hints(f)['return']
except(KeyError, AttributeError):
return Any
def g() -> return_type(f):
UPD 正如 Jim Fasarakis-Hilliard 所建议的,我们也可以使用 get_type_hints 而不是 注释
当前 不存在,the tracker for typing 上没有问题似乎表明它已在计划中。随时欢迎您创建一个问题,看看这是如何受到欢迎的。
目前您的方法可以解决问题(即分配类型),我要介绍的唯一更改是使用 typing
中的 get_type_hints
而不是获取 __annotations__
直接属性。结合 .get
(因为它 return 是一个字典),也可以使它更短:
def return_type(f):
return get_type_hints(f).get('return', Any)
def g() -> return_type(f):
如果您愿意,当然可以将其从函数中删除并在一行中使用。
如果存在向 return_type
提供随机对象的可能性,您将需要捕获它引发的 TypeError
和 return 您的默认值 Any
:
def return_type(f):
try:
return get_type_hints(f).get('return', Any)
except TypeError:
return Any
当然,由于这是动态分配类型,因此您不能指望静态类型检查器能够捕捉到它,您需要对此进行静态提示。