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

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

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

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

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

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

def f(**kwargs): foo = kwargs.pop('foo') bar = kwargs.pop('bar') ...etc...

是相同的”

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

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

这个习语非常重要,在Python 3中它现在有特殊的支持语法:在def签名中的单个*之后的每个参数都是关键字,也就是说,不能作为位置parameter passing,而只能作为一个命名parameter passing。 所以在Python 3中,您可以将上面的代码编写为:

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

事实上,在Python 3中,你甚至可以拥有不是可选的关键字参数(没有默认值的参数)。

但是,Python 2仍然有着长期的生产力,所以最好不要忘记Python 2中实现的技术和习惯用法,这些技术和习惯用法在Python 3中是直接支持的重要devise思想!

我build议这样的事情

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)将dictionaryA.update(dictionaryB)的内容添加到dictionaryA覆盖所有重复的键。

你会的

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

要么

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

如果你使用pop ,那么你可以检查是否有任何虚假值发送,并采取适当的行动(如果有的话)。

使用** kwargs和默认值很容易。 但有时候,你不应该首先使用** kwargs。

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

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" )

由于参数数量未知时使用**kwargs ,为什么不这样做呢?

class Exampleclass(object): def __init__(self, **kwargs): for k in kwargs.keys(): if k in [acceptable_keys_list]: self.__setattr__(k, kwargs[k])

这是另一种方法:

def my_func(arg1, arg2, arg3): ... so something ... kwargs = {'arg1': 'Value One', 'arg2': 'Value Two', 'arg3': 'Value Three'} # Now you can call the function with kwargs like this: my_func(**kwargs)

你可以做这样的事情

class ExampleClass: def __init__(self, **kwargs): arguments = {'val':1, 'val2':2} arguments.update(kwargs) self.val = arguments['val'] self.val2 = arguments['val2']

跟随@srhegdebuild议使用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]

当这个类被期望拥有我们acceptable列表中的所有项时,这个变体是很有用的。

我认为在Python中使用**kwargs的正确方法是使用字典方法setdefault ,如下所示:

class ExampleClass: def __init__(self, **kwargs): kwargs.setdefault('val', value1) kwargs.setdefault('val2', value2)

这样,如果用户在关键字args传递“val”或“val2”,将会使用它们; 否则,将使用已设置的默认值。

如果你想把它和* args结合起来,你必须在定义的最后保留* args和** kwargs。

所以:

def method(foo, bar=None, *args, **kwargs): do_something_with(foo, bar) some_other_function(*args, **kwargs)

@AbhinavGupta和@Steefbuild议使用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 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值