Как вернуть все элементы в моей структуре данных? - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь вернуть все элементы в моем списке, чтобы я мог отобразить его в таблице с помощью другой функции, а также повторно использовать те же данные, извлеченные для внесения изменений в другую функцию.

Цельздесь для извлечения данных из API, который содержит информацию об эмуляциях / модулях.С этими данными я создаю красивые таблицы для просмотра пользователем, а также использую их для внесения изменений.Некоторые изменения включают включение / отключение эмуляции и включение / отключение устройств, существующих внутри каждой эмуляции.

Текущая функция:

Эта текущая функция прекрасно работает, но требует рефакторинга, потому что мне нужно иметь возможность повторно использовать эти же данные внутри emulation_extraction для печати таблицыа также внести изменения в эти данные.

    def get_emulation_id():
        """This will get_emulation data and based on the emulation name chosen
        by the user it will extract the data by using emulation id and format a
        new structure so it can build a table.
        """
        emulation_name = input(input_message(msg="Please ENTER Emulation name: "))
        emulation_found = False
        for data in get_emulation():
            if emulation_name in data["name"]:
                emulation_found = True
                emulation = tesuto.apis.Emulation.get(data["id"]).data
                emulation_extraction = []
                for device in emulation.devices:
                    # tesuto.console.output(device)
                    emulation_extraction.append(
                        {
                            "name": device["name"],
                            "model_name": device["model_name"],
                            "version_name": device["version_name"],
                            "enabled/disabled": device["is_enabled"],
                        }
                    )
                headers = ["name", "model_name", "version_name", "enabled/disabled"]
                pretty_table = get_pretty_table(headers, emulation_extraction)

                print("\nEmulation name: ", data["name"], "\n")
                print(pretty_table.get_string())

        if not emulation_found:
            print("\nInvalid emulation name, Try again\n")
            view_emulation_info()

        user_input = input(input_message())

Когда я пытаюсь сделать это, он возвращает только один элемент в моем списке, а не все мои элементы, как это происходит, когда я манипулирую данными внутри get_emulation_id function:

    def get_emulation_id():
        """This will get_emulation data and based on the emulation name chosen
        by the user it will extract the data by using emulation id and format a
        new structure so it can build a table.
        """
        emulation_name = input(input_message(msg="Please ENTER Emulation name: "))
        emulation_found = False
        for data in get_emulation():
            if emulation_name in data["name"]:
                emulation_found = True
                emulation = tesuto.apis.Emulation.get(data["id"]).data
                emulation_extraction = []
                for device in emulation.devices:
                    # tesuto.console.output(device)
                    emulation_extraction.append(
                        {
                            "name": device["name"],
                            "model_name": device["model_name"],
                            "version_name": device["version_name"],
                            "enabled/disabled": device["is_enabled"],
                        }
                    )

                print("\nEmulation name: ", data["name"], "\n")
               # print(print_device_table().get_string())
                print(json.dumps(emulation_extraction, indent=4))

                return emulation_extraction

Ожидается увидеть и то, что я вижу без оператора return :

Please ENTER Emulation name: pod41

Emulation name:  pod410 

[
    {
        "name": "nxos-spine1",
        "model_name": "NX-OSv",
        "version_name": "7.0.3.I7.4",
        "enabled/disabled": false
    },
    {
        "name": "nxos-spine2",
        "model_name": "NX-OSv",
        "version_name": "7.0.3.I7.4",
        "enabled/disabled": false
    },
    {
        "name": "csr1",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
    },
    {
        "name": "csr2",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
    },
    {
        "name": "csr3",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
    },
    ....omitted
]

Emulation name:  pod411 

[
    {
        "name": "nxos-spine1",
        "model_name": "NX-OSv",
        "version_name": "7.0.3.I7.4",
        "enabled/disabled": false
    },
    {
        "name": "nxos-spine2",
        "model_name": "NX-OSv",
        "version_name": "7.0.3.I7.4",
        "enabled/disabled": false
    },
    {
        "name": "csr1",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
    },
    {
        "name": "csr2",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
    },
    {
        "name": "csr3",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
   ....omitted
]

Emulation name:  pod412 

[
    {
        "name": "nxos-spine1",
        "model_name": "NX-OSv",
        "version_name": "7.0.3.I7.4",
        "enabled/disabled": false
    },
    {
        "name": "nxos-spine2",
        "model_name": "NX-OSv",
        "version_name": "7.0.3.I7.4",
        "enabled/disabled": false
    },
    {
        "name": "csr1",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
    },
    {
        "name": "csr2",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
    },
    {
        "name": "csr3",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
    },
    {
        "name": "vmx1",
        "model_name": "MX",
        "version_name": "18.2R1.9",
        "enabled/disabled": false
   ....omitted
]

Emulation name:  pod413 

[
    {
        "name": "nxos-spine1",
        "model_name": "NX-OSv",
        "version_name": "7.0.3.I7.4",
        "enabled/disabled": false
    },
    {
        "name": "nxos-spine2",
        "model_name": "NX-OSv",
        "version_name": "7.0.3.I7.4",
        "enabled/disabled": false
    },
    {
        "name": "csr1",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
    },
    {
        "name": "csr2",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
    },
    {
        "name": "csr3",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
    },
    ....omitted
]

Что я на самом деле вижу с оператором return :

Please ENTER Emulation name: pod41

Emulation name:  pod410 

[
    {
        "name": "nxos-spine1",
        "model_name": "NX-OSv",
        "version_name": "7.0.3.I7.4",
        "enabled/disabled": false
    },
    {
        "name": "nxos-spine2",
        "model_name": "NX-OSv",
        "version_name": "7.0.3.I7.4",
        "enabled/disabled": false
    },
    {
        "name": "csr1",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
    },
    {
        "name": "csr2",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
    },
    {
        "name": "csr3",
        "model_name": "CSR1000v",
        "version_name": "16.8.1",
        "enabled/disabled": false
    },
    ....omitted
]

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Сделай это генератором.Вместо возврата используйте yield:

def get_emulation_id():
        """This will get_emulation data and based on the emulation name chosen
        by the user it will extract the data by using emulation id and format a
        new structure so it can build a table.
        """
        emulation_name = input(input_message(msg="Please ENTER Emulation name: "))
        emulation_found = False
        for data in get_emulation():
            if emulation_name in data["name"]:
                emulation_found = True
                emulation = tesuto.apis.Emulation.get(data["id"]).data
                emulation_extraction = []
                for device in emulation.devices:
                    # tesuto.console.output(device)
                    yield {
                              "name": device["name"],
                              "model_name": device["model_name"],
                              "version_name": device["version_name"],
                              "enabled/disabled": device["is_enabled"],
                          }

Это позволяет вам вызывать функцию как

result_list = [thing for thing in get_emulation_id()]

или лениво перебирать ее как

for result in get_emulation_id():
    # do something with result
0 голосов
/ 10 июня 2019

Поместите все извлеченные результаты в словарь, ключи которого являются именами эмуляции.Затем верните этот словарь в конце цикла.

def get_emulation_id():
    """This will get_emulation data and based on the emulation name chosen
    by the user it will extract the data by using emulation id and format a
    new structure so it can build a table.
    """
    emulation_name = input(input_message(msg="Please ENTER Emulation name: "))
    extracted_emulations = {}
    for data in get_emulation():
        if emulation_name in data["name"]:
            emulation = tesuto.apis.Emulation.get(data["id"]).data
            emulation_extraction = [{
                    "name": device["name"],
                    "model_name": device["model_name"],
                    "version_name": device["version_name"],
                    "enabled/disabled": device["is_enabled"],
                } for device in emulation.devices]

            extracted_emulations[data["name"]] = emulation_extraction

    return extracted_emulations
...