Есть ли способ получить функцию от пользователя в python с помощью различных функций python (т.е. если с персонализированным форматом)
Я делаю модель django, которая принимает строку от пользователя, и эта строка должна быть чем-то вроде '(some var)+15+IF((condition),(passed),(not passed))', и я хочу, чтобы она решала все это и, возможно, добавляла другие персонализированные функции в будущем, так что в основном для if это изначально не будет работать с eval из того, что я просмотрел.
Здесь много дискуссий о том, почему eval()
может быть плохой практикой (как видно из комментариев) и других вопросов, подобных этому: Почему использование 'eval' является плохой практикой?
Однако, чтобы попытаться ответить на ваш вопрос, я бы разбил вашу проблему на две составляющие:
Разбор пользовательского ввода в нечто понятное. В зависимости от того, как вы структурируете ввод, вы, скорее всего, получите множество
.splits()
иdict.get()
для проверки пользовательского ввода и извлечения значений для обработки. Плюс проверка левой и правой переменных операторов. Возможно, уже существуют библиотеки, которые могут это делать. Вероятно, вы захотите фундаментально повторить что-то вроде системы формул Excel.Обработка ввода в функции python, вы можете сопоставить ключи словаря с вызываемыми функциями, так что вы могли бы сделать что-то вроде этого:
import math, operator function_dict = { 'SUM': sum, 'SQRT': math.sqrt, '+': operator.add, ... }
Затем вы можете передать ваши разобранные имена функций в dict и передать значения в сопоставленную функцию python. Использование чего-то вроде functools
compose
позволит вам соединить эти функции в цепочку.
Однако, в качестве более простого и более ориентированного на Django решения, вы можете рассмотреть использование форм, моделей и ограничение пользовательского ввода чем-то более жестким, чем свободный текстовый ввод.
Удачи! :)