gpt4 book ai didi

python - args 在 python 中被映射到 kwargs

转载 作者:行者123 更新时间:2023-11-28 21:21:59 26 4
gpt4 key购买 nike

所以我昨天在做某事,发现这种事情是可能的。

In [3]: class Foo():
def __init__(self, data=False):
print data
...:

In [4]: foo = Foo(True)
True

所以你可以看到一个 arg 被映射到一个 kwarg,我想知道为什么这有效,以及如何?

感谢那些能给我相关示例的人。

最佳答案

def __init__(self, data=False):

这里的 data 不是 kwarg 而是一个有默认值的参数。如果你像这样调用 Foo

Foo(data = True, data1 = False)

此处 data1 将被视为 kwarg 并且分配给 data 的值将作为值传递给 data参数。关键字参数可以这样捕获

def __init__(self, data=False, **kwarg):
print data, kwarg

案例一

class Foo():
def __init__(self, data=False):
print data, kwarg

Foo(True, False)

这会抛出一个错误

TypeError: __init__() takes at most 2 arguments (3 given)

__init__ 需要一个位置参数或一个命名参数,但您传递的是两个位置参数。这就是它抛出此错误的原因。而不是这样,如果你这样调用它

Foo(True, data = False)

还是会报错

TypeError: __init__() got multiple values for keyword argument 'data'

因为您要为同一个参数传递两个值。

案例二

如果你想正确处理所有的位置参数和关键字参数,你可以使用这个

class Foo():
def __init__(self, *args, **kwargs):
print kwargs, args

Foo(True, data = False)

这将打印,

{'data': False} (True,)

因此,所有未命名的变量都转到 args 参数,所有命名的参数都转到 kwargs

案例三

即使在这种概括之后,您可能还想处理这样的情况。对于特定参数,如果用户未传递明确的值,您可能希望使用默认值。所以,这里可以使用默认参数

class Foo():
def __init__(self, data = False, *args, **kwargs):
print kwargs, args, data

Foo()
Foo(data = True)
Foo(data = True, data1 = "Welcome")
Foo(True, 1, data1 = "Welcome")
# Foo(True, data1 = "Welcome", 1) # This will throw an error

输出

{} () False
{} () True
{'data1': 'Welcome'} () True
{'data1': 'Welcome'} (1,) True

在这个例子中,

  1. 我们没有将值传递给data,因此假定为默认值(False)
  2. 我们显式地将一个值传递给data,以便采用该值
  3. 我们显式地将一个值传递给 data 和另一个关键字参数。
  4. 我们显式地将一个值传递给 data、位置参数和一个关键字参数。
  5. 这将引发错误,因为关键字参数后不应出现任何位置参数。顺序很重要

关于python - args 在 python 中被映射到 kwargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20247865/

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