对齐类型注释中的类型 Python
Align types in type annotation Python
我希望函数的参数是 list
和 Callable
可以根据 list
元素的类型调用,即:
import typing as tp
def foo(list_: list[T], func_: tp.Callable[[T], tp.Any]):
func_(list_[0])
我不关心 T
是什么类型,我只关心 func_
是否可以被调用 T
。
有没有办法注释函数而不需要特定类型的列表元素?
您需要将 T
设为 TypeVar
:
from typing import Callable, TypeVar
T = TypeVar("T")
U = TypeVar("U")
def foo(arr: list[T], func: Callable[[T], U]) -> None:
func(arr[0])
在对 foo
的给定调用中,arr
和 func
参数必须具有相同的 T
:
foo(["asdf", "foo"], lambda x: x.replace("a", "b")) # ok
foo([1, 2, 3], lambda x: x + 1) # ok
foo([1, 2, 3], lambda x: x.replace("foo", "bar")) # error
我建议使用另一个 TypeVar
作为 return 值的占位符,因为 Any
很容易在将来导致未捕获的错误,而 TypeVar
没有如果你对它支持的内容做出错误的假设,bound 将会出错:
def foo(arr: list[T], func: Callable[[T], Any]) -> None:
x = func(arr[0]) + 2 # ok (danger!)
def foo(arr: list[T], func: Callable[[T], U]) -> None:
x = func(arr[0]) + 2 # error (good!)
如果您希望 func
始终是 return 和 None
的函数,只需指定 None
而不是 U
或 Any
.
我希望函数的参数是 list
和 Callable
可以根据 list
元素的类型调用,即:
import typing as tp
def foo(list_: list[T], func_: tp.Callable[[T], tp.Any]):
func_(list_[0])
我不关心 T
是什么类型,我只关心 func_
是否可以被调用 T
。
有没有办法注释函数而不需要特定类型的列表元素?
您需要将 T
设为 TypeVar
:
from typing import Callable, TypeVar
T = TypeVar("T")
U = TypeVar("U")
def foo(arr: list[T], func: Callable[[T], U]) -> None:
func(arr[0])
在对 foo
的给定调用中,arr
和 func
参数必须具有相同的 T
:
foo(["asdf", "foo"], lambda x: x.replace("a", "b")) # ok
foo([1, 2, 3], lambda x: x + 1) # ok
foo([1, 2, 3], lambda x: x.replace("foo", "bar")) # error
我建议使用另一个 TypeVar
作为 return 值的占位符,因为 Any
很容易在将来导致未捕获的错误,而 TypeVar
没有如果你对它支持的内容做出错误的假设,bound 将会出错:
def foo(arr: list[T], func: Callable[[T], Any]) -> None:
x = func(arr[0]) + 2 # ok (danger!)
def foo(arr: list[T], func: Callable[[T], U]) -> None:
x = func(arr[0]) + 2 # error (good!)
如果您希望 func
始终是 return 和 None
的函数,只需指定 None
而不是 U
或 Any
.