Как написать код, который автоматически выполняет функцию на основе пользовательского ввода?

#python #spyder

Вопрос:

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

 #Function lists
def a1():
    return 'a'
def b2():
    return 'b'
def c3():
    return 'c'
def d4():
    return 'd'
def e5():
    return 'e'
def f6():
    return 'f'
def g7():
    return 'g'


while (cond):
    try:
        command=input('Enter a integer that matches the function's name')
        funcname=

        print(funcname)

    except ValueError:
        print('Wrong value. please enter an integer')
 

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

Части, над которыми я работаю, следующие:

  • команда, соответствующая имени функции, вводится на основе пользовательского ввода.
       command=input('Enter a integer that matches the function's name')
     
  • введенное пользователем целое число сопоставляется с именем функции, которая его содержит. например) пользовательский ввод=1, согласованная функция=a1()
       funcname=
     
  • распечатайте результаты функции
       print(funcname)
     
  • если вместо целых чисел в пользовательский ввод вводится символ, отправьте сообщение об ошибке.
       except ValueError:
          print('Wrong value. please enter an integer')
     
  • Условие цикла while, которое создало бы правильный цикл, выводящий приглашение пользователям для получения пользовательских вводов после выполнения предыдущего ввода.
           while (cond):
          .
          .
          end
     

Это так далеко, как я планировал и написал код, но, очевидно, ему предстоит пройти долгий путь, чтобы быть правильно выполненным.

Как заставить этот код работать?

Ответ №1:

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

Для этого можно использовать декоратор:

 def make_func_list():
    """Return a decorator which tracks which functions it's applied to.
    The decorator will have an `all` attribute to list these.
    """
    functions = []
    def wrapper(fn):
        functions.append((fn.__name__, fn))
        return fn
    wrapper.all = functions
    return wrapper

# Create the decorator
fl = make_func_list()

# Apply the decorator to each function to be included in the executor
@fl
def fn3(): return 3

@fl
def fn1(): return 1

@fl
def fn2(): return 2

# Can enumerate the list and solicit input based on index:
# (adjusted to be indexed from 1)
for n, (name, fn) in enumerate(fl.all):
    print(f'{n   1}: {name}')

response = int(input('Enter number: '))
name, func = fl.all[response - 1]
print(name, func())

# Or search the names instead (this one would search for any input):
response = input('Enter number: ')
for name, func in fl.all:
    if response in name:
        print(name, func())