2017-10-12 54 views
3

我想了解更多关于Python的信息 - 我目前正在使用3.6.3。Python 3:验证/解析** kwargs的最佳实践方法?

使用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) 

回答

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,其中作为显式声明的参数与默认值使非常明确哪些选项可用于传递到函数

+0

我理解这一点,这正是我的问题 - 在使用kwargs时是否有尝试验证参数的最佳实践方法,或者最佳做法是创建更多定义良好的动态类或子类? – johnnygear

1

您可以传递一个默认值得到()对于不在kwargs字典键:

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)