为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星coding 2019-09-18 10:44:01
**kwargs在默认值方面,在Python中使用的正确方法是什么?kwargs返回字典,但设置默认值的最佳方法是什么,还是有一个?我应该只是作为字典访问它吗?使用get函数?class ExampleClass:    def __init__(self, **kwargs):        self.val = kwargs['val']        self.val2 = kwargs.get('val2')一个简单的问题,但我找不到好的资源。人们在我看过的代码中采用不同的方式,并且很难知道要使用什么。
查看完整描述

3 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

您可以为默认值传递给get()不在字典中的键:


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

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


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


查看完整回答
反对 回复 2019-09-18
?
撒科打诨

TA贡献1934条经验 获得超2个赞

虽然大多数答案都是这样说的,例如,


def f(**kwargs):

    foo = kwargs.pop('foo')

    bar = kwargs.pop('bar')

    ...etc...

是相同的”


def f(foo=None, bar=None, **kwargs):

    ...etc...

这不是真的。在后一种情况下,f可以称为f(23, 42),而前者的情况下接受命名的参数只有 -没有位置的调用。通常,您希望允许调用者具有最大的灵活性,因此第二种形式(因为大多数答案断言)更可取:但情况并非总是如此。当你接受许多可选参数时,通常只有少数几个被传递,这可能是一个很好的想法(避免在你的呼叫站点发生意外和不可读的代码!)来强制使用命名参数 - threading.Thread就是一个例子。第一种形式是如何在Python 2中实现它。


成语是如此重要,以至于在Python 3现在有特殊的支持语法:单后每个参数*的def签名关键字只,也就是说,不能被作为位置参数传递,但只是作为一个命名的。所以在Python 3中你可以将上面的代码编写为:


def f(*, foo=None, bar=None, **kwargs):

    ...etc...

实际上,在Python 3中,您甚至可以使用非关键字的参数,这些参数不是可选的(没有默认值的参数)。


但是,Python 2仍然有很长一段时间的生产生活,所以最好不要忘记让你在Python 2中实现的技巧和习惯用法在Python 3中直接支持的重要设计思想!


查看完整回答
反对 回复 2019-09-18
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

我建议这样的事情


def testFunc( **kwargs ):

    options = {

            'option1' : 'default_value1',

            'option2' : 'default_value2',

            'option3' : 'default_value3', }


    options.update(kwargs)

    print options


testFunc( option1='new_value1', option3='new_value3' )

# {'option2': 'default_value2', 'option3': 'new_value3', 'option1': 'new_value1'}


testFunc( option2='new_value2' )

# {'option1': 'default_value1', 'option3': 'default_value3', 'option2': 'new_value2'}

然后以您想要的任何方式使用值


dictionaryA.update(dictionaryB)添加内容dictionaryB以dictionaryA覆盖任何重复的键。


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 3807 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信