gpt4 book ai didi

python - 为什么 *args 参数拆包给出一个元组?

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

在 python 中,可以定义一个带有任意数量位置参数的函数,如下所示:

def f(*args):
print(args)
f(1, 2, 3) # (1, 2, 3)

当作为 f(a, b, c) 调用时,所有位置参数都放在一个元组 中。此行为在 python 2 中有所描述。和 3文档,但我还没有找到它的 PEP。

PEP 3132 , 引入扩展的可迭代拆包 (first, *middle, last = seqence) 在“Acceptance”下声明

Make the starred target a tuple instead of a list. This would be consistent with a function's *args, but make further processing of the result harder.

进行了讨论。如果我写一个包装器,我可能还想像这样进一步处理参数:

def force_type(position, type):
def wrapper(f):
def new(*args, **kwargs):
args = list(args) # Why?
args[position] = type(args[position])
return f(*args, **kwargs)
return new
return wrapper

@force_type(1, int)
def func(a, b, c):
assert isinstance(b, int)

由于 args 是一个 tuple,这一进一步的处理变得更加困难。在引入的早期阶段是否没有使用包装器?如果是这样,为什么这在 python3 中没有随着其他兼容性破坏性变化而改变(PEP3132 倾向于易于处理而不是一致性(这看起来至少类似于兼容性破坏性变化中的兼容性)。

为什么一个函数 *args(仍然)是一个 tuple,即使 list 允许更容易的进一步处理?

最佳答案

我不知道这是否是它背后的想法,但处理起来很容易(尽管用 tuple 数据实例化一个 list 并不难)可能会导致混淆行为。

def fce1(*args):
fce2(args)
# some more code using args

def fce2(args):
args.insert(0, 'other_val')

fce1(1, 2, 3)

编写 fce1 代码的人可能会感到惊讶,他们没有意识到他们稍后处理的 args 不是函数调用的内容。

我还假设不可变类型更容易在内部处理并且开销更少。

关于python - 为什么 *args 参数拆包给出一个元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54170699/

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