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.)