gpt4 book ai didi

python - 使用参数、关键字参数、*args、**kwargs 与 Python 函数混淆

转载 作者:行者123 更新时间:2023-11-30 23:13:36 24 4
gpt4 key购买 nike

鉴于以下函数以及对 print_stuff() 的调用,有人可以解释为什么在不使用关键字 arg default 的情况下调用该函数但将列表传递给 *args 时会出现意外行为吗

我知道涉及可变/不可变关键字默认值的“陷阱”,但我认为这与这里无关。

有人可以澄清为什么会发生这种情况,或者有任何语法/调用错误吗?

def print_stuff(arg, kwarg=None, *args):
print "arg: %s" % arg

if kwarg:
print "kwarg: %s" % kwarg

if args:
for a in args:
print "printing {} from args".format(a)

print "===end==="

args_list = range(1, 3)
kwargs_list = {str(a):a for a in args_list}

print_stuff('hi', kwarg='some_kwarg') # works as intended

print_stuff('hi', 'some_kwarg', *range(1, 3)) # also works as intended

print_stuff('hi', *range(1, 3)) # first element of list unexpectedly passed in to keyword argument, even using the * notation

print_stuff('hi', kwarg='some_kwarg', *range(1, 3)) # TypeError: print_stuff() got multiple values for keyword argument 'kwarg'

最佳答案

除了 kwarg 具有默认值之外,print_stuff(arg, kwarg=None, *args)print_stuff(arg, kwarg, *args) - 如果有第二个位置参数,它将作为 kwarg 参数传递(任何后续位置参数最终都在 args 中)。

请注意:

print_stuff('hi', *range(1, 3))

评估为:

print_stuff('hi', 1, 2)

因此第一个参数转到 arg,第二个参数转到 kwarg,第三个参数转到 args[0]

<小时/>

那么如果我们注意到:

print_stuff('hi', kwarg='some_kwarg', *range(1, 3))

相当于:

print_stuff('hi', *range(1, 3), kwarg='some_kwarg')

因此:

print_stuff('hi', 1, 2, kwarg='some_kwarg')

你也许可以看到问题 - 再次'hi'12转到arg,分别是 kwargargs[0],但随后 kwarg另一个值意外出现。

<小时/>

如果您希望所有位置参数在考虑 kwarg 之前被“吸收”,请将函数定义更改为:

def print_stuff(arg, *args, **kwargs):
print "arg: %s" % arg
kwarg = kwargs.get('kwarg')
if kwarg is not None: # note explicit test - what if kwarg == 0?
print "kwarg: %s" % kwarg

for a in args: # no need to test here - loop doesn't run if no args
print "printing {} from args".format(a)

print "===end==="

使用中:

>>> print_stuff('hi', *range(1, 3))
arg: hi
printing 1 from args
printing 2 from args
===end===
>>> print_stuff('hi', *range(1, 3), kwarg='some_kwarg')
arg: hi
kwarg: some_kwarg
printing 1 from args
printing 2 from args
===end===

请注意,在 3.x 中您可以有 keyword-only arguments ,即以下是替代方案:

def print_stuff(arg, *args, kwarg=None):
...

关于python - 使用参数、关键字参数、*args、**kwargs 与 Python 函数混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29238108/

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