如何在 Python 中执行 'generic type hinting' 个函数(即 'function templates')?
How to do 'generic type hinting' of functions (i.e 'function templates') in Python?
我很确定,以前有人问过这个问题,但我不知道要搜索什么..
我想键入提示“通用”函数(类似于 C++ 中的函数模板)
例如(这个例子完全没有意义 - 它只是为了演示)
def foo(fn: Callable[Any, Any], args: Any) -> Any:
return fn(args)
我想在我有完整类型信息的上下文中使用这个函数,所以我希望我可以摆脱任何 Any
。
def bar() -> int:
func: Callable[[str], int] = lambda arg: len(arg)
return foo(func, "Hurz")
一种方法当然是明确地将 foo
转换为 (Callable[[str], int], str) -> int
,但我正在寻找通用方法。
我想我要找的东西与 generics 有关,但我看不出如何使用它们来创建“函数模板”。
Python typing
有两个部分来做通常所说的 generic programming or parametric polymorphism,或者简称为“泛型”或“模板”:
typing.TypeVar
定义一个通用占位符,例如T
,和
typing.Generic
定义一个泛型类型例如List
.
两者一起形成完全可参数化的类型,例如List[T]
。由于函数是内置的,def
关键字自然定义了泛型类型——只需要 TypeVar
。
只需为签名中需要的每个类型占位符定义一个TypeVar
:
from typing import TypeVar, Callable
T = TypeVar('T')
R = TypeVar('R')
def foo(fn: Callable[[T], R], args: T) -> R:
return fn(args)
我很确定,以前有人问过这个问题,但我不知道要搜索什么..
我想键入提示“通用”函数(类似于 C++ 中的函数模板)
例如(这个例子完全没有意义 - 它只是为了演示)
def foo(fn: Callable[Any, Any], args: Any) -> Any:
return fn(args)
我想在我有完整类型信息的上下文中使用这个函数,所以我希望我可以摆脱任何 Any
。
def bar() -> int:
func: Callable[[str], int] = lambda arg: len(arg)
return foo(func, "Hurz")
一种方法当然是明确地将 foo
转换为 (Callable[[str], int], str) -> int
,但我正在寻找通用方法。
我想我要找的东西与 generics 有关,但我看不出如何使用它们来创建“函数模板”。
Python typing
有两个部分来做通常所说的 generic programming or parametric polymorphism,或者简称为“泛型”或“模板”:
typing.TypeVar
定义一个通用占位符,例如T
,和typing.Generic
定义一个泛型类型例如List
.
两者一起形成完全可参数化的类型,例如List[T]
。由于函数是内置的,def
关键字自然定义了泛型类型——只需要 TypeVar
。
只需为签名中需要的每个类型占位符定义一个TypeVar
:
from typing import TypeVar, Callable
T = TypeVar('T')
R = TypeVar('R')
def foo(fn: Callable[[T], R], args: T) -> R:
return fn(args)