2017-02-03 4 views
0

In dieser Klasse:Python 2.7: Wie validiere ich eine Liste gegen ein bestimmtes Schema?

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

Die ersten beiden Elemente Strings sind, und sind erforderlich:

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 ein ähnliches Layout wie diese haben sollte. Nachfolgende Elemente sind Listen und optional. Die optionalen Elemente, wenn sollten drei erforderlichen Elemente enthalten enthalten:

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

Frage: Wie kann ich bestätigen node_info gegen dieses Format in der obigen Klasse? Muss ich die Liste parsen oder gibt es einen besseren Weg, ein Schema/Format zu definieren?

+0

Also, was haben Sie versucht? – pbuck

+0

Ich habe versucht, etwas Zeit zu sparen und vermeiden, es manuell zu validieren. – Laszlo

+1

Zwei Dinge über den existierenden Code: 1) in '__init__', sollte es' self._node_info = ... 'sein? 2) Sie sollten nicht das veränderbare Standardargument 'node_info = []' verwenden, das wird dieselbe Liste in allen Fällen verwenden, in denen das Standardargument verwendet wird. –

Antwort

1

Dies ist eine mögliche Lösung, eine benutzerdefinierte Prüfung verwendet werden:

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 aufgeführt wird here

Verwandte Themen