Получить индексное имя списка из словарей - PullRequest
0 голосов
/ 24 сентября 2019

Я хочу начать с того, что я ни в коем случае не эксперт по питонам, поэтому мне жаль, если я выражаю себя неправильно.

Я создаю скрипт, который выглядит примерно так:

from netmiko import ConnectHandler 

visw0102 = {
    'device_type': 'hp_comware',
    'ip': '192.168.0.241',
    'username': 'admin',
    'password': 'password'
}

visw0103 = {
    'device_type': 'hp_comware',
    'ip': '192.168.0.242',
    'username': 'admin',
    'password': 'password'
}

site1_switches = [visw0102, visw0103]

for switch in site1_switches:

... (rest of the script)

Я пытаюсь получить текущее имя индекса в цикле FOR, используя функцию enumerate(), чтобы получить имя индекса списка site1_switches, но так как этот список состоит из элементов словаря, словарьвозвращаются ключи:

>>> for index, w in enumerate(switch):
...     print(w)
...
device_type
ip
username
password

Есть ли способ получить фактическое имя индекса (VISW010X) вместо значений в словарях?

Спасибо

Редактировать : Ответом здесь был вложенный словарь, спасибо Жизнь сложна

Так что я смог продвинуться дальше.Вот код теперь.

from netmiko import ConnectHandler 

site1_switches = {
    'visw0102' : {
        'device_type': 'hp_comware',
        'ip': '192.168.0.241',
        'username': 'admin',
        'password': 'password'
    },
    'visw0103' : {
        'device_type': 'hp_comware',
        'ip': '192.168.0.242',
        'username': 'admin',
        'password': 'password'
    }
}

for key, values in site1_switches.items():
    device_type = values.get('device_type', {})
    ip_address = values.get('ip', {})
    username = values.get('username', {})
    password = values.get('password', {})

for key in site1_switches.items():
    net_connect = ConnectHandler(**dict(key))     <- The ConnectHandler needs a dictionary

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

Вот что я получаю:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: dictionary update sequence element #0 has length 8; 2 is required

Мне нужно было бы найти способ преобразовать набор в словарь, но кажется, что dict(key) не работает, так как он помещает набор в первый ключ словаря (или так кажется).

В любом случае, я могу этого добиться?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

К сожалению, не представляется хорошим и кратким способом получить доступ к имени словаря, но Получить имя словаря предоставляет некоторые возможные обходные пути:

Вложение ваших словари-переключателя ввсеобъемлющий словарь, который отображает имена в словари - это один метод.

site1_switches = {
    "visw0102": visw0102, 
    "visw0103": visw0103
}

Другой способ - добавить ключ «имя» в каждый словарь, чтобы вы могли получить доступ к именам каждого переключателя в site1_switches с помощью * 1008.*

visw0102 = {
    'name': 'visw0102',
    'device_type': 'hp_comware',
    'ip': '192.168.0.241',
    'username': 'admin',
    'password': 'password'
}

visw0103 = {
    'name': 'visw0103',
    'device_type': 'hp_comware',
    'ip': '192.168.0.242',
    'username': 'admin',
    'password': 'password'
}
0 голосов
/ 24 сентября 2019

Рассматривали ли вы использование вложенного словаря?

site1_switches = {
'visw0102': {
'device_type': 'hp_comware',
'ip': '192.168.0.241',
'username': 'admin',
'password': 'password'
}, 
'visw0103': {
'device_type': 'hp_comware',
'ip': '192.168.0.242',
'username': 'admin',
'password': 'password'
}}

for key, value in site1_switches.items():
  print (key)
  # output
  visw0102
  visw0103

Вот еще один способ сделать это.

for index, (key, value) in enumerate(site1_switches.items()):
  print(index, key, value)
  # output
  0 visw0102 {'device_type': 'hp_comware', 'ip': '192.168.0.241', 'username': 'admin', 'password': 'password'}
  1 visw0103 {'device_type': 'hp_comware', 'ip': '192.168.0.242', 'username': 'admin', 'password': 'password'}

Более полное решение

from netmiko import ConnectHandler 

# nested dictionary
site1_switches = {
'visw0102': {
'device_type': 'hp_comware',
'ip': '192.168.0.241',
'username': 'admin',
'password': 'password'
}, 
'visw0103': {
'device_type': 'hp_comware',
'ip': '192.168.0.242',
'username': 'admin',
'password': 'password'
}}

for key, values in site1_switches.items():
  device_type = values.get('device_type', {})
  ip_address = values.get('ip', {})
  username = values.get('username', {})
  password = values.get('password', {})
  print (f'{key}', {device_type}, {ip_address}, {username}, {password})
  # output 
  visw0102 {'hp_comware'} {'192.168.0.241'} {'admin'} {'password'}
  visw0103 {'hp_comware'} {'192.168.0.242'} {'admin'} {'password'}

  print (f'Establishing a connection to {key}')
  # output 
  Establishing a connection to visw0102

  # pseudo code based on ConnectHandler parameters
  switch_connect = ConnectHandler(device_type=device_type, host=ip_address, username=username, password=password)

  # checking that the connection has a prompt 
  switch_connect.find_prompt()

  # What you want to do goes here...
  # Example
  command_output = switch_connect.send_command('display current-configuration')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...