2017-10-12 7 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からを使用してはるかに明確

ほとんどの問題は、そのすべての自己文書化で...私は何を考えているんではないという事実から来ているまさにありません引数は、FooまたはBarのどちらにも指定できません。デフォルトで明示的に宣言された引数は、関数に渡すために使用できるオプションを明確にしています。

+0

Iをkwargsを使用する際に引数を検証するためのベストプラクティスの方法があるのでしょうか、またはよりよく定義された、より動的でないクラスや子クラスを作成するのがベストプラクティスですか? – johnnygear

1

デフォルト値を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) 
関連する問題