使用可选参数时,什么时候最好使用** kwargs和最好使用关键字?

时间:2019-06-22 01:18:26

标签: python kwargs

如果我有一个具有三个或四个可选关键字参数的函数,则最好使用** kwargs或在函数定义中指定它们?

我觉得 def foo(required, option1=False, option2=False, option3=True) 比看起来笨拙得多 def foo(required, **kwargs)

但是,如果我需要使用这些关键字作为条件关键字,并且它们不存在,则会抛出KeyErrors,并且我想在每个条件都有些混乱之前检查密钥。

def foo(required, **kwargs):
    print(required)
    if 'true' in kwargs and kwargs['true']:
        print(kwargs['true'])

foo('test', true='True')
foo('test2')

vs

def foo(required, true=None):
    print(required)
    if true:
        print(true)

foo('test', true='True')
foo('test2')

我想知道最pythonic的方式是什么。我有一个正在处理的函数,具体取决于传递的参数将返回不同的值,所以我想知道处理它的最佳方法。它现在可以工作,但是我想知道是否有更好和更Python化的方式来处理它。

2 个答案:

答案 0 :(得分:5)

如果函数仅在其自身的操作中使用参数,则应显式列出所有参数。这将使Python能够检测到对函数的调用中是否提供了无效的参数。

当您需要接受动态参数时,通常会使用**kwargs,这是因为您要将它们传递给其他函数,并且希望您的函数接受其他函数需要的任何参数,例如other_func(**kwargs)

答案 1 :(得分:0)

在保持函数定义整洁的同时传递几个可选参数的一种简单方法是使用包含所有参数的字典。这样您的功能就会变成

def foo(required, params):
    print(required)
    if 'true' in params and params['true']:
        print(params['true'])

如果您的参数可以是任意值,并且您不太在意,例如装饰器函数,则您真的想使用**kwargs。如果您实际上要在函数中使用参数,则应明确指定它们。