在Python中正确使用**kwargs的方法

602
在Python中,使用**kwargs时,有什么正确的方法来设置默认值呢? kwargs返回一个字典,但是设置默认值的最佳方法是什么,或者是否有一种方法?我应该只是将其作为字典来访问吗?使用get函数吗?
class ExampleClass:
    def __init__(self, **kwargs):
        self.val = kwargs['val']
        self.val2 = kwargs.get('val2')

人们在代码中以不同的方式进行操作,我见过很多种方法,很难知道该使用哪种方法。
14个回答

7
如果你想将此与*args结合使用,则必须在定义的末尾保留*args和**kwargs。
所以,格式应为:
def method(foo, bar=None, *args, **kwargs):
    do_something_with(foo, bar)
    some_other_function(*args, **kwargs)

3
另一个处理未知或多个参数的简单解决方案可以是:
class ExampleClass(object):

    def __init__(self, x, y, **kwargs):
      self.x = x
      self.y = y
      self.attributes = kwargs

    def SomeFunction(self):
      if 'something' in self.attributes:
        dosomething()

2

**kwargs提供了添加任意数量关键字参数的自由。可以有一个关键字列表,为其设置默认值。但是为无限数量的键设置默认值似乎是不必要的。最后,将键作为实例属性可能很重要。因此,我会这样做:

**kwargs给予使用者添加大量关键字参数的自由度。使用者可以设置一组关键字并对应设置默认值。但对于无限数量的关键字而言,设置默认值显得有些多余。最终,将这些关键字作为实例属性存储可能是非常重要的。因此,我建议这样操作:

class Person(object):
listed_keys = ['name', 'age']

def __init__(self, **kwargs):
    _dict = {}
    # Set default values for listed keys
    for item in self.listed_keys: 
        _dict[item] = 'default'
    # Update the dictionary with all kwargs
    _dict.update(kwargs)

    # Have the keys of kwargs as instance attributes
    self.__dict__.update(_dict)

1

@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是一个包含不在默认值中出现的参数名称的set


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接