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

When using optional arguments when is it best to use **kwargs and best to use keywords?

如果我有一个具有三个或四个可选关键字参数的函数,最好使用 **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')

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

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

我想知道最pythonic的方法是什么。我有一个正在处理的函数,根据传递的参数将 return 不同的值,所以我想知道处理它的最佳方法。它现在可以工作了,但我想知道是否有更好更 pythonic 的处理方式。

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

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

在保持函数定义清晰的同时传递多个可选参数的一种简单方法是使用包含所有参数的字典。这样你的函数就变成了

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

如果您的参数可以是任何东西而且您并不关心,例如装饰器函数,那么您真的想使用 **kwargs。如果你真的要在函数中使用参数,你应该明确指定它们。