Python 3:验证/解析**kwargs的最佳实践方法是什么?

7

我正在努力学习Python - 我目前使用的是3.6.3版本。

在使用kwargs时,参数验证/解析的最佳实践是什么?

或者,在不使用kwargs的情况下,参数验证/解析的最佳实践是什么?

class foo:
  def __init__(self, **kwargs):
    if 'a' in kwargs:
      self.a = kwargs['a']
    else:
      self.a = 0

class bar(foo):
  def __init__(self, **kwargs):
    super().__init__()
    if 'x' in kwargs:
      self.x = kwargs['x']
    else:
      self.x = 23

# b and y are undefined, but my classes use kwargs - what is the best practice for validating / parsing dynamic arguments?
test = bar(b=1,y=24)
2个回答

6
你可以为不在kwargs字典中的键传递一个默认值给get()函数:
def __init__(self, **kwargs):
    self.a = kwargs.get("a", 0)
    self.x = kwargs.get("x", 23)
    # etc.

或者,如果你想在你的类中将 kwargs 中的任何值设置为实例变量,可以这样做:

def __init__(self, **kwargs):
    for k, v in kwargs.items():
        self.__setattr__(k, v)

2
class Foo:
   def __init__(self,a=0):
       self.a = a

class Bar(Foo):
    def __init__(self,b=21,**kwargs):
        self.b = b  # accept whatever you want for this child
        Foo.__init__(self,**kwargs) # pass remaining kwargs down the line

这个方法和你的Foo类做的事情一样,但更加清晰易懂。

使用kwargs最常见的问题是它没有自我记录... 我不知道可以或应该为FooBar提供哪些参数,而显式声明带有默认值的参数则非常清楚地说明了可以传递给函数的选项。


1
我理解这一点,这也正是我的问题 - 在使用kwargs时尝试验证参数是否有最佳实践的方法,或者最佳实践只是创建更明确定义且不太动态的类或子类? - johnnygear
1
据我所知,**kwargs更常见的用法是在以下情况下使用:(a)你继承的类不是你拥有或控制的;(b)你实际上没有继承该类。pandas.read_hdf提供了一个很好的例子:它使用pytables,其中包括HDF5,在read_hdf方法中存在许多潜在的变化超出其控制范围,因此该方法具有自己的参数,然后是**kwargs,它被传递到上游由pytables使用。 - Mike Williamson
这绝对是正确的...但并不反驳我关于kwargs问题的观点。 - Joran Beasley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接