【问题标题】:Confusion with Python functions using an argument, keyword argument, *args, **kwargs使用参数、关键字参数、*args、**kwargs 与 Python 函数混淆
【发布时间】:2023-04-06 19:00:01
【问题描述】:

鉴于以下函数和对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'

【问题讨论】:

  • 您没有任何关键字-only 参数,因此您传入的第二个参数将分配给kwarg
  • 第二个值作为第二个参数传入有什么意外?

标签:
python
args
keyword-argument