小能豆

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

javascript

**kwargs当谈到默认值时,在 Python 中正确的使用方法是什么?

kwargs返回一个字典,但设置默认值的最佳方法是什么,或者有一种方法吗?我应该将其作为字典访问吗?使用get函数?

class ExampleClass:
    def __init__(self, **kwargs):
        self.val = kwargs['val']
        self.val2 = kwargs.get('val2')

据我所知,人们在代码中使用不同的方法,很难知道该使用哪种。


阅读 37

收藏
2024-09-22

共1个答案

小能豆

在 Python 中,使用**kwargs是允许函数或方法灵活使用参数的常用方法。在处理默认值时,使用kwargs.get()通常被认为是一种好方法,因为如果字典中不存在键,它允许您指定默认值kwargs

**kwargs以下是处理默认值的不同方法的概述:

1. 使用kwargs.get()

这是处理可选关键字参数默认值的最常见且简洁的方法。当访问可能存在也可能不存在的键时,您可以直接提供默认值。

class ExampleClass:
    def __init__(self, **kwargs):
        self.val = kwargs.get('val', 0)  # Default to 0 if 'val' is not provided
        self.val2 = kwargs.get('val2', 'default_value')  # Default to 'default_value'
  • 优点:它明确、易读,并为默认值提供了灵活性。
  • 缺点:当您有许多键时,就会重复。

kwargs2.作为字典访问

如果您直接访问字典,KeyError则如果键不存在,它将引发。当您希望某些键始终存在时,此方法是最佳方法。

class ExampleClass:
    def __init__(self, **kwargs):
        self.val = kwargs['val']  # Raises KeyError if 'val' is missing
  • 优点:确保始终传递所需的参数。
  • 缺点:不适合可选参数,并且需要手动处理丢失的键。

3. 使用kwargs.pop()

如果您想检索值并将其从字典中删除(如果您以后不需要访问它),pop()则工作方式类似get(),但会删除键。

class ExampleClass:
    def __init__(self, **kwargs):
        self.val = kwargs.pop('val', 0)  # Default to 0 if 'val' is not present
        self.val2 = kwargs.pop('val2', 'default_value')
  • 优点:如果您想kwargs通过删除检索到的密钥来修改,这很好。
  • 缺点:从中删除密钥kwargs,这可能并不总是理想的。

4.**kwargs与显式参数和默认值相结合

您可以明确定义一些参数,但仍将其用作**kwargs其他可选参数。这样,您可以直接为最重要的参数设置默认值。

class ExampleClass:
    def __init__(self, val=0, val2='default_value', **kwargs):
        self.val = val
        self.val2 = val2
        self.extra = kwargs  # Store any additional keyword arguments
  • 优点:使所需参数更清晰,同时仍允许使用附加关键字参数的灵活性。
  • 缺点:稍微有点冗长。

使用哪种方法?

  • 对于必需参数kwargs:直接访问( kwargs['key'])以确保参数被传递,并在需要时使用 try-except 手动处理丢失的键。
  • 对于可选参数:使用kwargs.get('key', default_value)干净的方式提供默认值。
  • 如果需要修改kwargs:使用pop()来检索和删除密钥。
  • 为了使论点明确:使用标准论点和的组合**kwargs

混合方法示例:

class ExampleClass:
    def __init__(self, val=0, **kwargs):
        self.val = val
        self.val2 = kwargs.get('val2', 'default_value')
        self.extra = kwargs  # Store any additional kwargs if needed

这种方法为您提供了灵活性、可读性和默认处理机制。

2024-09-22