当涉及到默认值时,在Python中使用**kwargs的正确方法是什么?

Kwargs返回一个字典,但是设置默认值的最佳方法是什么?我应该把它作为字典来访问吗?使用get函数?

class ExampleClass:
    def __init__(self, **kwargs):
        self.val = kwargs['val']
        self.val2 = kwargs.get('val2')

一个简单的问题,但我找不到好的资料。在我所见过的代码中,人们用不同的方式来实现它,很难知道该用什么。


当前回答

你会做

self.attribute = kwargs.pop('name', default_value)

or

self.attribute = kwargs.get('name', default_value)

如果使用pop,则可以检查是否发送了任何虚假值,并采取适当的操作(如果有)。

其他回答

你会做

self.attribute = kwargs.pop('name', default_value)

or

self.attribute = kwargs.get('name', default_value)

如果使用pop,则可以检查是否发送了任何虚假值,并采取适当的操作(如果有)。

对于不在字典中的键,可以传递一个默认值给get():

self.val2 = kwargs.get('val2',"default value")

但是,如果您计划使用具有特定默认值的特定参数,为什么不首先使用命名参数呢?

def __init__(self, val2="default value", **kwargs):

@AbhinavGupta和@Steef建议使用update(),我发现这对于处理大型参数列表非常有帮助:

args.update(kwargs)

如果我们想检查用户是否传递了任何虚假/不受支持的参数,该怎么办?@VinaySajip指出,pop()可以用于迭代处理参数列表。那么,任何剩余的论点都是虚假的。好了。

下面是另一种可能的方法,它保持了使用update()的简单语法:

# kwargs = dictionary of user-supplied arguments
# args = dictionary containing default arguments

# Check that user hasn't given spurious arguments
unknown_args = user_args.keys() - default_args.keys()
if unknown_args:
    raise TypeError('Unknown arguments: {}'.format(unknown_args))

# Update args to contain user-supplied arguments
args.update(kwargs)

Unknown_args是一个包含不出现在默认值中的参数名的集合。

跟进@srhegde使用setattr的建议:

class ExampleClass(object):
    __acceptable_keys_list = ['foo', 'bar']

    def __init__(self, **kwargs):
        [self.__setattr__(key, kwargs.get(key)) for key in self.__acceptable_keys_list]

当期望类拥有可接受列表中的所有项时,此变体非常有用。

使用**kwargs和默认值很容易。然而,有时候你一开始就不应该使用**kwarg。

在这种情况下,我们并没有充分利用**狼。

class ExampleClass( object ):
    def __init__(self, **kwargs):
        self.val = kwargs.get('val',"default1")
        self.val2 = kwargs.get('val2',"default2")

上面是一个“为什么要麻烦?”的声明。这和

class ExampleClass( object ):
    def __init__(self, val="default1", val2="default2"):
        self.val = val
        self.val2 = val2

当您使用**kwargs时,意味着关键字不仅是可选的,而且是有条件的。有比简单的默认值更复杂的规则。

当您使用**kwargs时,您通常指的是类似于下面的内容,其中不应用简单的默认值。

class ExampleClass( object ):
    def __init__(self, **kwargs):
        self.val = "default1"
        self.val2 = "default2"
        if "val" in kwargs:
            self.val = kwargs["val"]
            self.val2 = 2*self.val
        elif "val2" in kwargs:
            self.val2 = kwargs["val2"]
            self.val = self.val2 / 2
        else:
            raise TypeError( "must provide val= or val2= parameter values" )