2016-04-26 8 views
0

私は、kwargsだけを取るクラスを持っています。私はkwargsからはいくつかのキー[「コンテンツ」]は常にPythonを使用してキーとデータ型をマップするkwargs

  • ... kwargs['content']にあるものをモデル化し、チェックするための柔軟な方法を必要とする

    > content = "{'user': 1, 'theme':'red'}" 
    > kwargs['content'] = content 
    > m = Message(**kwargs) 
    

    :引数kwargs['content']userthemeキーが含まれていますプレゼント。

  • 常に値がnullでなく型に一致していることを確認してください。

これは私が試したことですが、より良い方法があるように感じます。

class Message(object): 
    def __init__(self, *args, **kwargs): 

     for field in self._hash_model(): 
      if field not in kwargs['content']: 
       raise ValidationError('Missing % field'.format(field)) 
      # check type 
      # turn to json 



    def _hash_model(self): 
     """ 
     My model of values that need to be in content 
     """ 
     model = { 
      'user': int, 
      'theme': str 
     } 

     return model 

私はPython 3.4を使用しています。

+0

'__init__'メソッドも' * args'を使っていますか? – AKS

+0

'content'は' str'か 'dict'ですか? –

+0

@CPandaのコンテンツは残念ながら文字列として渡されます! – Prometheus

答えて

1

次の機能が役立つかどうかを確認してください。あなたが合う場合の方法に検証ロジックから__init__

def __init__(self, *args, **kwargs): 
    content = json.loads(kwargs["content"]) # assuming kwargs has "content" key 
    for key,val in self._hash_model().items(): 
     field = content.get(key) # returns None if absent 
     if field and typeof(field) is val: 
      # go ahead 
     else: 
      raise SomeException 

にファクターを変更します。それがうまくいかない場合はコメントしてください。

+0

これは正しいトラックで、json.loadsの@AKSに対する部分的なクレジットを私にもたらします – Prometheus