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

时间:2017-10-12 23:57:34

标签: python python-3.x validation kwargs

我正在尝试更多地了解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 个答案:

答案 0 :(得分:2)

您可以将默认值传递给不在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)

答案 1 :(得分:1)

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提供哪些参数显式声明具有默认值的参数非常清楚可以传递给函数的选项