#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())