Python中表达式Expressions简介

Expressions 是一个轻量级算术表达式解析器,用于创建简单的算术表达式编译器。

目标是提供最小且易于理解的接口来处理相同语法但略有不同方言的算术表达式(见下文)。该框架将保持轻量级,并且不太可能提供任何更复杂的语法结构。

解析器是手写的以避免任何依赖性。唯一的要求是 Python 3。 来源:github.com/Stiivi/expressions

特征 该表达式应为中缀表达式,其中可能包含:

  • 数字和字符串(文字)
  • 变量
  • 二元和一元运算符
  • 具有可变数量参数的函数调用
然后,编译器用于构建一个对象,作为每个标记的编译结果。

方言 表达式的语法是固定的。可以使用dialect包含以下内容的结构来指定细微的差异:

  • 运算符列表、它们的优先级和关联性
  • 区分大小写(当前仅用于基于关键字的运算符)
未来版本中将包含的方言的计划选项:
  • 字符串引用字符(当前为单引号'和双"引号)
  • 标识符引用字符(当前不支持)
  • 标识符字符(当前_和字母数字字符)
  • 小数点分隔符(当前.)
  • 函数参数列表分隔符(当前为逗号,)
使用 预期用途是将定制表达式评估嵌入到应用程序中。 使用示例:
  • 具有变量访问控制的变量检查编译器。
  • 统一的表达语言,其中各种其他后端都是可能的。
  • 用于自定义对象结构的编译器,例如提供类似接口的函数式编程的框架。

如何 编写自定义编译器类并实现方法:

  • compile_literal获取一个数字或字符串对象
  • compile_variable取一个变量名
  • compile_operator采用二元运算符和两个操作数
  • compile_unary采用一元运算符和一个操作数
  • compile_function获取函数名称和参数列表
每个方法都会接收一个编译上下文,它是在调用时传递给编译器的自定义对象compile(expression, context)。

以下编译器将表达式重新编译回其原始形式,并仅对指定为编译上下文的某些变量进行可选访问限制:

class AllowingCompiler(Compiler):
    def compile_literal(self, context, literal):
        return repr(literal)

    def compile_variable(self, context, variable):
        """Returns the variable if it is allowed in the context"""

        if context and variable not in context:
            raise ExpressionError("Variable %s is not allowed" % variable)

        return variable

    def compile_operator(self, context, operator, op1, op2):
        return "(%s %s %s)" % (op1, operator, op2)

    def compile_function(self, context, function, args):
        arglist = ", " % args
        return "%s(%s)" % (function, arglist)

创建一个编译器实例并尝试得到结果:

compiler = AllowingCompiler()

result = compiler.compile("a + b", context=["a", "b"])
a = 1
b = 1
print(eval(result))

输出2

但是:result = compiler.compile("a + c") 输出错误

有关更多示例,例如 从表达式构建SQLAlchemy 结构