2017-02-03 8 views
0

:最初の2つの要素は文字列であり、必要とされるPython 2.7:指定されたスキーマに対してリストを検証する方法は?このクラスの

sample_node_info = [ 
    'Node Name', 
    'Node URL', 
    status, 
    ['Service1','ServiceURL1',status], 
    ['Service2','ServiceURL2',status] 
] 

class message: 
    def __init__(self, node_info = None): 
     if node_info is None: node_info = [] 
     self.node_info = node_info 

    @property 
    def node_info(self): 
     return self._node_info 

    @node_info.setter 
    def node_info(self, value): 
     self._node_info = value 

node_infoこれと同じレイアウトを有するべきです。後続の要素はリストであり、オプションです。オプションの要素は、含まれている場合、必要な3つの要素が含まれている必要があります

service_info = ['ServiceName','ServiceURL',status] 

は質問:どのように私は上記のクラスでは、このフォーマットに対してnode_info検証していますか?リストを解析する必要がありますか、ある種のスキーマ/フォーマットを定義するなど、より良い方法がありますか?

+0

をリストされている、あなたは何を試してみましたか? – pbuck

+0

私はしばらく時間を節約しようとし、それを手動で検証しないようにしました。 – Laszlo

+1

既存のコードに関する2つのこと:1) '__init__'に、' self._node_info = ... 'でなければなりませんか? 2)変更可能なデフォルト引数 'node_info = []'を使用しないでください。デフォルトの引数が使用されているすべてのインスタンスで同じリストが使用されます。 –

答えて

1

これはカスタムバリデータを使用して、可能な解決策である:

import sys 
from private import private 

class message: 
    #status_t = ['offline', 'online'] 

    def __init__(self, node_info = None): 
     if node_info is None: 
     self.node_info = [] 
     else: 
     self.__validate_node_info(node_info) 
     self.node_info = node_info 

    @property 
    def node_info(self): 
     return self.node_info 

    @node_info.setter 
    def node_info(self, value): 
     self.__validate_node_info(value) 
     self.node_info = value 

    def toString(self): 
     s = '' 
     return s 


    @private 
    def __validate_node_info(self, lst, level=0): 

     ''' 
     Validates the node_info list, against this schema: 

     node_info = [ 
     required(str), 
     required(str), 
     required(int), 
     optional(service_info), 
     optional(service_info),...] 

     service_info = [required(str),required(str),required(int)] 

     Sample input: 

     sample_node_info = [ 
     'Node Name', 
     'Node URL', 
     status, 
     ['Service1','ServiceURL1',status], 
     ['Service2','ServiceURL2',status] 
     ] 

     ''' 

     i = 0 
     lstlen = len(lst) 

     if lstlen < 2: 
     raise TypeError("The list %s is too short" % (lst)) 
     if level > 0: 
     if len(lst) != 3: 
      raise TypeError("The list %s should contain exactly %d elements" % (lst,3)) 
     for e in lst: 
     argval = lst[i] 
     if i < 2: 
      if not type(argval) is str: 
       raise TypeError("type is %s, must be %s" % (type(argval), str)) 
     elif i == 2: 
      if not type(argval) is int: 
       raise TypeError("type is %s, must be %s" % (type(argval), int)) 
     else: 
      self.__validate_node_info(lst[i],level+1) 
     i=i+1 


#message.node_info = ['node1', 'nodeurl1', 1, ['service1', 'serviceurl1', 0], ['service2', 'serviceurl2', 1] ] 
#print(message.node_info) 

private.pyはそうhere

関連する問題