对齐类型注释中的类型 Python

Align types in type annotation Python

我希望函数的参数是 listCallable 可以根据 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 的给定调用中,arrfunc 参数必须具有相同的 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 而不是 UAny.