Можете ли вы вызвать / использовать функцию, возвращенную из списка в Python? - PullRequest
0 голосов
/ 18 марта 2020

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

elements: list = [] # List meant to contain a tuple with the name of the item and the function of the item.
def quit_code():
    exit()
element.append(("quit", quit_code))

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

user_input = "quit" # For brevity, I'm just writing this. Let's just imagine the user actually typed this.
if elements[0][0] == user_input:
    #This is the part I don't understand so I'm just going to make up some syntax.
    run_method(elements[0][1])

Проблема заключается в методе run_method, который я произвольно выбрал. Мне нужен способ запуска метода, возвращаемого elements [0] [1], который является методом quit_code. Мне не нужно альтернативное решение для этого примера, потому что я просто придумал, чтобы показать, что я хочу сделать. Если у меня есть функция или объект, который содержит функцию, как я могу запустить эту функцию.

(проще всего я могу это произнести) Если у меня есть object_a (для меня это кортеж), содержащий str_1 и fun_b, как я могу запустить fun_b из объекта.

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

__list_of_stuff: list = []    
def add_to_list(name, function):
    __list_of_stuff.append((name, function))

А затем где-то еще

def example_init_method():
    def stop_code():
        exit()

    add_to_list("QUIT", stop_code())

Теперь обратите внимание, что я не могу получить доступ метод stop_code где-либо еще в коде, если я не использую его с по объект __list_of_stuff.

Наконец, было бы неплохо не создавать функцию для ввода. Под этим я подразумеваю непосредственную вставку кода в параметр без создания локальной функции, такой как stop_code. Хотя я не знаю, как это сделать.

1 Ответ

0 голосов
/ 18 марта 2020

Python относится к функциям как первоклассные граждане. Таким образом, вы можете делать такие вещи, как:

def some_function():
    # do something
    pass

x = some_function

x()

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

def quit_code():
    exit()

operations = dict(quit=quit_code)

operations['quit']()

Словарь связывает значение с ключом. Единственное правило - ключ должен быть неизменным. Это означает, что числа, строки, кортежи и другие неизменяемые объекты.

Чтобы создать словарь, вы можете использовать {и}. И чтобы получить значение по его ключу, используйте [and]:

 my_dictionary = { 'a' : 1, 'b' : 10 }

 print(my_dictionary['a'])    # It will print 1

. Вы также можете создать словарь с dict , например:

 my_dictionary = dict(a=1, b=10)

Однако это работает только для строковых ключей.

Но, учитывая, что вы используете quit_code для инкапсуляции вызова выхода, почему бы не использовать выход напрямую?

 operations = dict(quit=exit)

 operations['quit']()

Если словари не подходят, вы все еще может использовать списки и кортежи:

 operations = [('quit',exit)]

 for key, fun in operations:
     if key == 'quit':
         fun()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...