exec中的全局命令不替换值

时间:2019-02-28 08:42:50

标签: python global-variables

import re
def test ( var ):
    op=""" 
    1/1/1/1  up        up :99005      53476      99005      g993-2-17a  
    1/1/1/2  up        up :99005      53148      99005      g993-2-17a  
    1/1/1/3  up        up :99005      53793      99005      g993-2-17a  
    """
    op=op.splitlines()
    for line in op:
        pattern = "([0-9]+/[0-9]+/[0-9]+/[0-9]+) *?([a-z]+) *?([a-z]+) :([0-9]+) +?([0-9]+) +?([0-9]+) +?([a-z0-9-]+)"
        if re.search(pattern, line):
            match=re.search(pattern, line)
            var1=re.sub(r'/', '_', match.group(1))
            x = var+"_"+ var1
            print x
            if_index = match.group(1)
            adm_state = match.group(2)
            exec("global %s" % (x))
            exec("%s = {}" % (x))
            exec("%s['whole']=match.group(0)" % (x))
            exec("%s['if_index']=match.group(1)" % (x))
            exec("%s['adm_state']=match.group(2)" % (x))
            exec("%s['opr_state']=match.group(3)" % (x))
            exec("%s['tx_rate_us']=match.group(5)" % (x))
            exec("%s['tx_rate_ds']=match.group(6)" % (x))
            exec("%s['op_mode']=match.group(7)" % (x))
            print info_1_1_1_1['if_index']


test("info")
print info_1_1_1_1

大家好,我是python和脚本新手。上面的是我的脚本,我的目标是创建多个字典并为相应的字典分配键和值对。我想为每一行创建单独的字典。我想从全球范围内使用同名的字典。如果有什么不清楚的地方,让我纠正。

在全球空间中,我想访问诸如info_1_1_1_1 ['whole']

之类的词典

1 个答案:

答案 0 :(得分:1)

global在两次exec调用之间不存在。这会起作用:

exec("global bar\nbar=3\n")

但是变量的动态设置是强烈的代码味道。每次发现自己做类似的事情时,都应该立即停止并重新评估是否有另一种方法可以做到这一点。在这种情况下,我建议改用字典:

import re
data = {}
def test ( var ):
    op=""" 
    1/1/1/1  up        up :99005      53476      99005      g993-2-17a  
    1/1/1/2  up        up :99005      53148      99005      g993-2-17a  
    1/1/1/3  up        up :99005      53793      99005      g993-2-17a  
    """
    op=op.splitlines()
    for line in op:
        pattern = "([0-9]+/[0-9]+/[0-9]+/[0-9]+) *?([a-z]+) *?([a-z]+) :([0-9]+) +?([0-9]+) +?([0-9]+) +?([a-z0-9-]+)"
        if re.search(pattern, line):
            match=re.search(pattern, line)
            var1=re.sub(r'/', '_', match.group(1))
            x = var+"_"+ var1
            print(x)
            data[x] = {
                "whole": match.group(0),
                "if_index": match.group(1),
                "adm_state": match.group(2),
                "opr_state": match.group(3),
                "tx_rate_us": match.group(5),
                "tx_rate_ds": match.group(6),
                "op_mode": match.group(7),
            }
            print(data["info_1_1_1_1"]['if_index'])

test("info")
print(data["info_1_1_1_1"])