почему мое меню словаря не появляется? - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь отобразить меню для группы маршрутизаторов, которое описывается словарем, в котором содержатся фрагменты информации об их состоянии. Для этого у меня есть функция, которая принимает словарь routers, который содержит информацию об устройстве в качестве ввода. Словарь преобразуется в список объектов словаря, называемый router_list, отсортированный по значению имени устройства, с использованием for-l oop. Все устройства сохраняются в переменную menu_text, которая, в свою очередь, используется для перечисления и печати устройств.

Когда я запускаю этот код, я получаю эту ошибку:

 python3 menu.py 
Traceback (most recent call last):
  File "menu.py", line 28, in <module>
    'password': '2020'
  File "menu.py", line 6, in show_menu
    router_list.append("%s. %s " % ((i+2), value['name'],))
TypeError: string indices must be integers

Вот мой код:

def show_menu(routers):
    router_list = []
    i = 0
    for key, value in enumerate(routers):           
        router_list.append("%s. %s " % ((i+2), value['name'],))
        i = i + 1

    menu_text = '\n'.join(router_list)

    print(("""
---------------------------------------------------------
-----------------------------------------------------

0.EXIT
1.CONFIG ALL
"""+ menu_text +"""
---------------------------------------------------------
          """))

if __name__ == '__main__':
    show_menu({
    'name': 'cisco_ios',
    'ip': '192.168.122.217',
    'username': 'admin',
    'password': '2020'
     })

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Зацикливая словарь с помощью enumerate(), вы получаете индекс и ключ, а не ключ и значение. И, value['name'] приведет к ошибке, поскольку value не представляет словарь, это ключ (name, ip, и т. Д. c. В вашем случае).

Для циклического перебора пары ключ / значение вы можете использовать dict.items() следующим образом:

for k, v in dict.items():
    print(k, v)

Соответствующий поток: enumerate () для словаря в python


Поскольку вы передаете в качестве словаря только одну информацию о маршрутизаторе, т.е. routers, вам не нужно указывать l oop поверх него, чтобы извлечь имя маршрутизатора.

Вы можете просто использовать routers['name'] и все готово!

Пример ( live ):

def show_menu(routers):
    print(("""
---------------------------------------------------------
0.EXIT
1.CONFIG ALL
2."""+ routers['name'] +"""
---------------------------------------------------------
          """))

if __name__ == '__main__':
    show_menu({
    'name': 'cisco_ios',
    'ip': '192.168.122.217',
    'username': 'admin',
    'password': '2020'
     })

Вывод:

---------------------------------------------------------
0.EXIT
1.CONFIG ALL
2.cisco_ios
---------------------------------------------------------

Но, если есть Если вы используете несколько маршрутизаторов, то вы можете использовать список словарей, обозначающих маршрутизаторы и l oop поверх него, используя for, например: ( live ):

def show_menu(routers):
    router_list = []
    i = 0
    for router in routers:
        router_list.append("%s. %s " % ((i+2), router['name'],))
        i = i + 1

    menu_text = '\n'.join(router_list)

    print(("""
---------------------------------------------------------
0.EXIT
1.CONFIG ALL
"""+ menu_text +"""
---------------------------------------------------------
          """))

if __name__ == '__main__':
    show_menu([{
        'name': 'cisco_ios',
        'ip': '192.168.122.217',
        'username': 'admin',
        'password': '2020'
     },
     {
        'name': 'cisco_ios_123',
        'ip': '192.168.xxx.xxx',
        'username': 'admin',
        'password': '2021'
     }
     ])

Вывод:

---------------------------------------------------------
0.EXIT
1.CONFIG ALL
2. cisco_ios 
3. cisco_ios_123 
---------------------------------------------------------
0 голосов
/ 02 мая 2020

Вы должны передать список словарей в show_menu(), например

routers = [
    {
        'name': 'cisco_ios',
        'ip': '192.168.122.217',
        'username': 'admin',
        'password': '2020'
     },
]
show_menu(routers)

. Причина в том, что в вашем коде show_menu() вы предполагаете, что value является словарем, поэтому аргументом для routers должен быть список словарей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...