1 Вопрос: Могу ли я использовать имя переменной вместо значения этой переменной?

вопрос создан в Thu, May 2, 2019 12:00 AM

Итак, у меня есть довольно простая программа, которая запрашивает ввод данных пользователем, а затем использует регулярные выражения для просмотра строк файла и замены выделенного текста значениями, введенными пользователем.

В настоящее время у меня это работает, но это довольно неуклюже: 24 строки запрашивают ввод данных пользователем (я считаю, что это неизбежно) и еще 24 строки для подстановки регулярных выражений.

Что бы я хотел сделать, если это возможно, это заменить эти 24 строки регулярных выражений одной строкой, которая выбирает текст для замены на основе имени переменной.

Я думал об использовании массива для переменных, а затем о цикле for для их прохождения.

Это код, который я сейчас использую. Он отлично работает, это просто метод грубой силы.

hostname = input("Please enter the hostname of the device: ")
switch = input("Please enter the switch that the device connects to: ")
switch_ip = input("Please enter the ip address of that switch: ")

for line in fileinput.input(inplace=1, backup='.bak'):
    line = re.sub('<hostname>',hostname, line.rstrip())
    line = re.sub('<switch>',switch, line.rstrip())
    line = re.sub('<switch-ip>',switch_ip, line.rstrip())
    print(line)

Я думал о чем-то вроде этого:

hostname = input("Please enter the hostname of the device: ")
switch = input("Please enter the switch that the device connects to: ")
switch_ip = input("Please enter the ip address of that switch: ")

var_array[] = hostname, switch, switch_ip

for line in fileinput.input(inplace=1, backup='.bak'):
    for v in var_array[]:
        line = re.sub('<v>',v, line.rstrip())
    print(line)

Важно, однако, чтобы v в '' должно было иметь имя переменной в качестве значения, а не значение самой переменной, поэтому Regex работает правильно.

Итак, на var_array[0] линия

line = re.sub('<v>',v, line.rstrip())

становится р>

line = re.sub('<hostname>',hostname, line.rstrip())

Я чувствую, что это возможно, но я не могу найти, как это сделать.

Любая помощь приветствуется.

    
0
  1. Не используйте динамические переменные, используйте контейнер в виде списка или dict
    2019-05-02 15: 25: 12Z
1 ответ                              1                         

Вы можете просто создать указание имен переменных в качестве ключа и значений в качестве значения.

var_map = {}
var_map['hostname'] = input("Please enter the hostname of the device: ")
var_map['switch'] = input("Please enter the switch that the device connects to: ")
var_map['switch_ip'] = input("Please enter the ip address of that switch: ")

for line in fileinput.input(inplace=1, backup='.bak'):
    for var, val in var_map.items():
        line = re.sub(f'<{var}>', val, line.rstrip())
    print(line)

    
1
2019-05-02 15: 06: 21Z
  1. О, хорошая идея, я попробую.
    2019-05-02 15: 09: 44Z
  2. Hm не работает. Я не получаю сообщение об ошибке, но я также не получаю вывод в текстовый файл.
    2019-05-02 15: 32: 23Z
  3. Я предполагаю, что 'var' из строки цикла не применяется к 'var' в '< {var} >', поэтому на самом деле ничего не происходит соответствует этой строке.
    2019-05-02 15: 38: 28Z
  4. Попробуйте напечатать f '< {var} >' в каждом цикле, чтобы увидеть, генерируется ли ожидаемое регулярное выражение или нет.
    2019-05-03 06: 37: 54Z
источник размещен Вот