Python2.7:如何根据指定的模式验证列表?

Python2.7:如何根据指定的模式验证列表?,python,python-2.7,Python,Python 2.7,在本课程中: 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_i

在本课程中:

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
节点信息的布局应与以下内容类似:

sample_node_info = [
  'Node Name',
  'Node URL',
  status,
  ['Service1','ServiceURL1',status],
  ['Service2','ServiceURL2',status]
]
前两个元素是字符串,是必需的。后续元素是列表,并且是可选的。可选元素(如果包括)应包含三个必需元素:

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

问题:如何在上面的类中根据此格式验证节点_信息?我必须解析列表还是有更好的方法,比如定义某种模式/格式?

这是一种可能的解决方案,使用自定义验证器:

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)
导入系统 从私人进口私人 班级信息: #状态\u t=[“脱机”、“联机”] 定义初始化(self,node\u info=None): 如果节点信息为“无”: self.node_info=[] 其他: 自我验证节点信息(节点信息) self.node\u info=节点\u info @财产 def节点_信息(自身): 返回self.node\u信息 @node_info.setter def节点_信息(自身、值): 自我验证节点信息(值) self.node_info=值 def toString(自): s=“” 返回s @私人的 定义验证节点信息(自身、lst、级别=0): ''' 根据此架构验证节点信息列表: 节点信息=[ 必需(str), 必需(str), 必需(整数), 可选(服务信息), 可选(服务信息),…] 服务信息=[必需(str)、必需(str)、必需(int)] 样本输入: 示例\u节点\u信息=[ “节点名称”, “节点URL”, 地位 ['Service1','ServiceURL1',状态], ['Service2','ServiceURL2',状态] ] ''' i=0 lstlen=len(lst) 如果lstlen<2: raise TypeError(“列表%s太短”%(lst)) 如果级别>0: 如果len(lst)!=三: raise TypeError(“列表%s应正好包含%d个元素”%(lst,3)) 对于lst中的e: argval=lst[i] 如果i<2: 如果类型(argval)不是str: raise TypeError(“类型为%s,必须为%s”%(类型(argval),str)) elif i==2: 如果不是,则类型(argval)为int: raise TypeError(“类型为%s,必须为%s”%(类型(argval),int)) 其他: 自我验证节点信息(lst[i],级别+1) i=i+1 #message.node_info=['node1','nodeurl1',1,['service1','serviceurl1',0],'service2','serviceurl2',1]] #打印(消息节点信息)
private.py已列出

那么,您尝试了什么?我试图节省一些时间,并避免手动验证它。关于现有代码,有两件事:1)在
\uuu init\uuu
中,应该是
self.\u node\u info=…
?2) 您不应该使用可变默认参数
node_info=[]
,这将在使用默认参数的所有实例中使用相同的列表。这基本上是一个工具/软件库请求,在SO上不属于主题。有几个很好的模式验证库。是很受欢迎的。太好了!谢谢@wim.)