gpt4 book ai didi

python3 输入 : extract argument list from Callable

转载 作者:太空宇宙 更新时间:2023-11-03 11:43:45 28 4
gpt4 key购买 nike

考虑一个包装另一个函数并将输出放入单例列表的函数:

def listify(func):
return lambda *kargs, **kwargs: [func(*kargs, **kwargs)]

你会如何在 python3 中对这个函数进行类型提示?这是我最好的尝试:

from typing import Callable, TypeVar
T = TypeVar('T')

def listify(func: Callable[..., T]) -> Callable[..., List[T]]:
return lambda *kargs, **kwargs: [func(*kargs, **kwargs)]

但我不高兴返回的 Callable 没有继承输入 Callable 的参数类型的签名。有没有办法在不对 func 的参数数量做出假设的情况下实现这一点?

最佳答案

随着 Python 3.10 的发布,对于旧的 Python 版本,typing-extensions package 3.10.0 及以上版本,您可以使用 ParamSpec() construct .

一个 ParamSpec() 对象就像一个 TypeVar() object ,但它不是充当单个参数的占位符,而是模拟可调用对象接受的参数组合。

在这里使用这样一个对象作为参数的占位符:

from typing import Callable, List, TypeVar
try:
from typing import ParamSpec
except ImportError:
from typing_extensions import ParamSpec

P = ParamSpec("P")
T = TypeVar("T")

def listify(func: Callable[P, T]) -> Callable[P, List[T]]:
return lambda *kargs, **kwargs: [func(*kargs, **kwargs)]

如果您坚持使用 Python 3.4 或更早版本,那么您将无法使用类型提示执行您想要的操作,因为 type_extensions 3.10.0 不再支持该 Python 版本并且有没有其他语法可以捕获 TypeVar 泛型中的参数部分。 Callable 最初保持简单,因为它实际上只是表示回调函数。

关于python3 输入 : extract argument list from Callable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44185951/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com