Exec не присваивает значение перерменной

Рейтинг: 0Ответов: 1Опубликовано: 12.07.2023

В общем, я делаю программу, с помощью которой можно будет ходить по спискам в списке и смотреть содержимое в них. Код:

import os

class listTraveler:
    def __init__(self, array: list):
        self.array = array
        self.position = array

    def printElements(self):
        os.system("cls")
        print("--items--")
        for index, item in enumerate(self.position):
            print(f"{index} - {item}")
        print("---------")
        print("b - back")
        print("e - exit")

    def goForward(self, itemNumber: int):
        self.position = self.position[itemNumber]
        self.printElements()

    def goBack(self):
        pass

def main():
    array = [[1, 2, 3, 4, 5, [6, 7, 8]], [[9], 10, [11, 12]]]

    traveler = listTraveler(array)
    traveler.printElements()

    while True:
        userInput = input(">>> ")

        if userInput != "b" and userInput != "e":
            if type(traveler.position[int(userInput)]) == list:
                traveler.goForward(int(userInput))
            else:
                traveler.printElements()
        elif userInput == "b":
            traveler.goBack()
        elif  userInput == "e":
            exit()

if __name__ == "__main__":
    main()

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

Думаю, что лучшим решением будет функция, которая принимает список и индекс в виде строки, так как если это строка, то можно менять эти индексы. Вот функция:

def func(array: list, index: str):
    item = 0
    exec(f"item = array{index}")
    return item

item = func([1, 2, 3, 4], "[2]")
print(item)

Но в итоге она возращает 0, а должна была вернуть 3. exeс() почему то не присвоил значение item, оно так и осталось равно 0. Как это исправить? Или может быть другой вариант решения?

Ответы

▲ 2Принят

В целом вместо exec() вы можете использовать eval() примерно так:

def func(array: list, index: str):
    return eval(f'array{index}')

Но выглядит это если честно крайне неверно и простите за выражение глупо, просто используйте нативные возможности языка:

def func(array: list, index: int):
    item = array[index]
    return item


item = func([1, 2, 3, 4], 2)
print(item)