我从我的配置文件中读取数据:
ip_vlan1 = "10.10.($id+100).5"
ip_vlan2 = "10.11.($id*2+1).6"
v.v...
对于每个vlan,我想基于ID和vlan-expression为它计算vlan地址:
def calculate_vlan_id(id, vlan_exp):
...
return ip_addr # string
示例:
def(3, ip_vlan1) --> result: "10.10.103.5"
def(5, ip_vlan2) --> result: "10.11.11.6"
你有解决方案吗?
提前谢谢,伙计们!
答案 0 :(得分:3)
您可以使用文本模板引擎。 (这比使用基于eval的技巧更安全。)
以下是使用genshi
的示例from genshi.template import TextTemplate
ip_vlan1 = TextTemplate("10.10.${id+100}.5")
ip_vlan2 = TextTemplate("10.11.${2*id+1}.6")
print( ip_vlan1.generate(id=3) ) # prints 10.10.103.5
print( ip_vlan2.generate(id=5) ) # prints 10.11.11.6
如果你真的需要calculate_vlan_id
函数,它看起来像这样:
def calculate_vlan_id(id,ip_vlan):
return ip_vlan.generate(id=id)
修改强>
根据请求,这是一个使用jinja2的例子:这可能不是最好的方法,jinja2文档很大且令人困惑。
ip_vlan1 = jinja2.Template('10.10.{{id+100}}.5')
ip_vlan2 = jinja2.Template('10.11.{{2*id+1}}.6')
ip_vlan1.render(id=3)
ip_vlan2.render(id=5)
这两种方法都是未经测试
答案 1 :(得分:1)
def calculate_vlan_id(id, vlan_exp):
vlan_exp_list = vlan_exp.split(".")
vlan_exp_list[2].replace("$id", id);
vlan_exp_list[2] = eval(vlan_exp_list[2])
return '.'.join(vlan_exp_list) # string
答案 2 :(得分:1)
如果你确定你只有'id',那么你就可以这样做。
def replace(id, vlan_exp):
vlan_exp = vlan_exp.replace('$id',str(id))
return ".".join(map(str,map(eval,vlan_exp.split('.'))))
但是使用eval并使用eval可能对您的程序有害。