gpt4 book ai didi

python - 修饰 Python3 函数以忽略 (a, b, *args, **kwargs) 中的 *args?

转载 作者:行者123 更新时间:2023-11-28 20:48:17 25 4
gpt4 key购买 nike

python 3.3:我可以装饰一个函数来忽略所有与命名参数不匹配的位置参数吗?

import functools
def ignore_star_args():
def wrapper(function_):
@functools.wraps(function_)
def wrapped(*f_args):
return function_(/*only named args*/)
return wrapped
return wrapper

@ignore_star_args()
def list_args(a, b, *args):
# two positional arguments
return [a, b] + list(args)

>>> list_args(1, 2, "non-positional arg")
[1, 2]

最佳答案

我认为您误解了所使用的术语。

Arguments是传递给 function call 的值.位置参数是没有关键字的参数。

Parametersfunction definition 中的名字.存在三种不同的位置参数;总的来说,它们是包括 * 参数或裸 *(如果有)在内的参数。

例如,在这段代码中:

def foo(a, b, c=3, d=4, *args, e, f=6, **kw): pass

foo(1, 2, d=3, c=4, e=5, g=7)

abcd 都是位置或关键字参数; args 是一个可变位置参数ef仅关键字参数kw 是一个 var 关键字参数。 (没有仅位置参数的示例,因为它们不能出现在函数定义中;您必须编写 C/Java/.NET/RPython/任何扩展代码,或创建 代码 对象,以获取它们。)

在调用中,12位置参数3457关键字参数dceg关键字标识符

Python 会将两个位置参数与前两个仅位置参数或位置或关键字参数匹配,或者如果没有足够的位置参数则与 var 位置参数匹配,然后将关键字参数匹配到位置或-keyword 或 keyword-only 具有相同名称的参数,或者如果找不到名称,则为 var-keyword 参数。所以,在 foo 中:

a, b, c, d, args, e, f, kw = 1, 2, 4, 3, (), 5, 6, {'g': 7}

既然你已经弄清楚了所有这些,让我来回顾一下:Python 偶尔会使用不同的术语,“形式参数”而不是“参数”和“实际参数”的“争论”。您通常只能在源代码最古老的部分中找到它,但偶尔它会冒出更高的部分。


那么,您要求忽略非位置参数的内容。换句话说,您想接受但忽略关键字参数。这很简单:只需使用 var-keyword 参数接受它们,不要传递它们:

def wrapped(*args, **kwargs):
return function_(*f_args)

但是,我认为您想要询问的是如何忽略所有与仅位置参数或位置或关键字参数不匹配的参数、位置参数或关键字参数。

为此,您需要检查包装函数的签名。

不同类型的成员的确切引用可能很难找到,当您这样做时也很难理解……但幸运的是,inspect文档将所有内容收集在一个方便的图表中。

您可以看到函数没有任何看起来像其参数签名的东西……但它包含一个代码对象,。当然代码对象是在 Python 只有 2 种参数的时候设计的,它们被称为“形式参数”而不是“参数”,所以你在这里想要的可能不是很明显 co_argcount——但是相信我,它是。

所以:

def wrapped(*args):
return function_(*(args[:function_.__code__.co_argcount]))

根据您想对关键字参数执行的操作(请记住,它们可能匹配命名的位置或关键字或仅位置参数!),您可能想使用 **kwco_varnames

关于python - 修饰 Python3 函数以忽略 (a, b, *args, **kwargs) 中的 *args?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17226243/

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