Ошибка значения при использовании exec внутри класса - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь написать функцию, в которой пользователь вводит логику функции, и мой фреймворк создаст из нее плагин, готовый к выполнению.Я не могу использовать функции 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

Пожалуйста, дайте какие-нибудь идеи о том, как это исправить

...