2017-10-12 55 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)