# myExpr **Repository Path**: bigmouth/myExpr ## Basic Information - **Project Name**: myExpr - **Description**: python版本的自定义简单表达式解析执行器 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-16 - **Last Updated**: 2023-11-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 表达式工具 一个简单的自定义表达式编译,运行工具 ## 语法 * 支持+,-,*,/ 四则运算运算 * 支持==,>=, >, <=, <, in 布尔运算 * in运算符后可以接数组(list方法包装或变量传递),字典和元组(通过变量传进来) * 支持逻辑与(&&)和逻辑或(||)运算 * 支持通过括号提升运算优先级 * 支持变量,格式:$变量名$ * 支持类型:整型,浮点数,字符串(用单引号包裹识别), 数组(用list方法包装) * 支持自定义方法:无参数,单参数,多参数,参数用逗号隔开 * 内置部分自定义方法,详情请看“内置方法”章节 ## 规则例子 * 四则运算 ```python 表达式:1*(2+3)/5 结果:1.0 ``` * 布尔运算 ```python 表达式:1 > 2 结果:False ``` * 布尔运算in ```python 表达式:1 in list(1,2,3) 结果:True ``` * 自定义方法 ```python sum方法用来计算参数的合 表达式:sum(1,2,3,4) 结果: 10.0 ``` * 变量 ```python 有变量a=10 表达式: $a$-9 结果: 1 ``` * 逻辑运算 ```python 表达式:1 > 0 && -1 < 0 结果: True ``` ## 使用方式 * 普通使用 ```python # 通过new方法获取一个运行时 rt = runtime.new() # 执行表达式 result = rt.exec("10 - 9") ``` * 带变量 ```python # 通过new方法获取一个运行时 rt = runtime.new() # 传入变量,执行表达式 result = rt.exec("$a$ - 9", {"a": 10}) ``` * 使用自定义方法(无参数) ```python class LastLoginTime(Func): """ 自定义方法 """ def get_name(self) -> str: return "last_login_time" def calc(self, ctx: Context, *param): return '2020-01-01 00:00:00' if __name__ == '__main__': rt = runtime.new() # 给运行时添加自定义方法 rt.add_func(LastLoginTime()) result = rt.exec("last_login_time() > '2020-01-01 01:00:00") ``` * 使用自定义方法(带参数) ```python class Sum(Func): """ 计算参数合 """ def get_name(self) -> str: return "sum" def calc(self, ctx: Context, *param): if not param: raise InvalidException("参数不能为空") for data in param: if not isinstance(data, (int, float)): raise InvalidException("参数类型错误:" + type(data)) return math.fsum(param) if __name__ == '__main__': rt = runtime.new() rt.add_func(Sum()) result = rt.exec("sum(1,2,3)") ``` * 字符串使用 ```python class Int(Func): """ 字符串或浮点转整型 """ def get_name(self) -> str: return "int" def calc(self, ctx: Context, *param): if len(param) != 1: raise InvalidException("参数只能有一个") data = param[0] if not isinstance(data, (str, float)): raise InvalidException("参数类型错误:" + type(data)) return int(data) if __name__ == '__main__': rt = runtime.new() rt.add_func(Int()) result = rt.exec("int('10')") ``` ## 内置方法 **list** 说明:创建列表 声明:list(n1, n2...) 实例: ```python list(1,2,3) ``` ---- **between** 说明:判断值是否在一个闭区间内 声明:between(data, start, end) 实例: ```python between(1, 0, 10) ``` ---- **int** 说明:字符串或浮点数转整型,浮点数直接截取整数部分 声明:int(data) 实例: ```python int('10') ```