глобальная команда в exec, не подставляющая значения - PullRequest
0 голосов
/ 28 февраля 2019
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 голосов
/ 28 февраля 2019

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"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...