Я пытаюсь написать функцию, в которой пользователь вводит логику функции, и мой фреймворк создаст из нее плагин, готовый к выполнению.Я не могу использовать функции lamda, поскольку они оценивают только отдельные выражения и ограничивают область действия пользовательских функций.
Я пытаюсь решить эту проблему, предоставляя пользователю определенный шаблон функции, который содержит некоторые конкретные имена функций.Пользователь заполняет шаблон, и я использую оператор exec
для интеграции кода.
Вот шаблон функции:
def rule(output):
pass
Пользователь заполняет шаблон следующим образом:
def rule(output):
return True if 'PSU' in output else False
То, как я это реализую, выглядит следующим образом:
>>> code = """def rule(output):
return True if 'PSU' in output else False
"""
>>> exec(code)
>>> print(rule)
>>> print(rule('RACPSU: Y'))
True
Это работает, как и ожидалось.Однако, когда я использую ту же логику внутри класса, она не работает.
class Condition:
def __init__(self, code_str):
pass
def __call__(self, *args, **kwargs):
code = """def rule(output):
return True if 'PSU' in output else False
"""
exec(code)
print(rule)
if __name__ == '__main__':
c1 = Condition('')
print(c1())
Это дает ошибку: NameError: name 'rule' is not defined
Пожалуйста, дайте какие-нибудь идеи о том, как это исправить