ifullut
@ifullut
Учу программирование понарошку...

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

Имеется три функции:

def say(what):
    print(what)

def sum(a, b):
    print(a + b)

def connect(to):
    print(f"You are connected to {to}!")

И также имеется input.
Суть программы, в том, что пользователь вводит название функции с ее аргументами, если они нужны. А программа должна выполнять нужную функцию с аргументами, если они нужны.
Пример работы:
INPUT: Что делаем? say hello world
OUTPUT: hello world

INPUT: Что делаем? connect mywifi
OUTPUT: You are connected to mywifi

INPUT: Что делаем? sum 3 5
OUTPUT: 8
Как это реализовать? Есть идея использовать условия if и просто обрезать название Функции и сказать аргументами, но можно ли это написать более рациональным способом?
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
@lob4Noff
kirillinyakin подсказал более компактный метод, в свою очередь могу предложить Вам доработанную версию Вашей идеи, где не будет рекурсивной ошибки, а сумма будет находиться для независимого количества чисел.

def say(what):
    print(what)

def get_sum(*args):
    items = [int(item) for item in list(*args)]
    print(sum(items))

def connect(to):
    print(f'You are connected to "{to}"!')

dict_func = locals()
print(dict_func['connect'])

while True:
    request = input('Enter your request: ')
    if 'say' in request and 'say' in request.split()[0]:
        say(request.replace('say ', ''))
    elif 'sum' in request:
        get_sum(request.split()[1:])
    elif 'connect' in request and 'connect' in request.split()[0]:
        connect(request.replace('connect ', ''))
    elif request == 'exit':
        print('Goodbye!'); break
    else:
        print("I don't understand you, try again!")
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@kirillinyakin
В питоне есть функция locals(), которая возвращает все переменные в текущем пространстве имен, осталось только проитерироваться по этому словарю, где ключ это имя переменной, а значение это ссылкс на нее, и проверить на совпадение имен и то, что в значении находится функция
Ответ написан
@dmshar
Предложенный выше варианты - неполохи, но жестко завязаны на конкретные функции и даже их количество. Добавьте еще одну функцию - и надо вносить правки в скрипт. Что не есть хорошо.

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

Всего-то:
def ExecIt(func, param):
    return func(param)


Тогда в самом скрипте достаточно вставить всего две строчки:
request = input('Enter your request: ')
ExecIt(globals()[request.split()[0]], request.split(maxsplit=1)[1])

и получить УНИВЕРСАЛЬНОЕ решение.

Единственное, что надо учесть - это то, что сами функции могут иметь разное количество параметров. Например, у ТС в функции sum их два, а в остальных один. А может быть и больше. Или меньше. Поэтому самый правильный путь - распарсить параметры в случае необходимости либо уже в самих функциях. Надеюсь, для ТС это не составит труда. В любом случае - это уже тема другого вопроса.
Ответ написан
@kaka888
Lua, C++ разработчик
Есть функции exec и eval, они запускают переданный текст как код.
Пример:
exec("sum(4, 5)")
result = eval("sum(4, 5)")
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы