Skip to main content

A FEEL (Friendly Enough Expression Language) parser for Python

Project description

bkflow-feel: A FEEL (Friendly Enough Expression Language) Parser for Python

简介

bkflow-feel 是一款基于 Python 的 FEEL (Friendly Enough Expression Language) 语法解析器,用于对 FEEL 语法表达式进行解析和运算,得到对应的 Python 对象作为计算结果。

FEEL 是 OMG (Object Management Group) 定义的 DMN (Decision Model and Notation) 规范中的一部分。 所以,bkflow-feel 可用于决策引擎 (DMN) 中决策表达式的解析。

除此之外,bkflow-feel 也可用于流程引擎 (BPMN) 中分支网关条件表达式的解析。

Quick Start

1. 安装依赖

$ pip install bkflow-feel

2. 表达式解析

from bkflow_feel.api import parse_expression

print(parse_expression(expression="1+1"))  # print(2)
print(parse_expression(expression="a > b", context={"a": 2, "b": 1})) # print(True)
print(parse_expression(expression="[1,2,3,4][3]")) # print(3)

通过 parse_expression 函数,可以传入表达式并进行计算,parse_expression 接收以下参数:

  • expression: string 类型,FEEL 表达式文本
  • context: dict 类型,非必填,默认为 None,计算表达式时使用的上下文
  • raise_exception: boolean 类型,非必填,默认为 True,如果解析和计算过程中校验失败或异常,是否抛出异常,如果为 False 则异常时返回 None

3. 注册并调用自定义函数

注册自定义函数支持两种方式,但请尽量选择一种方式进行注册,推荐使用第一种

a. 通过定义类进行注册

from bkflow_feel.utils import BaseFEELInvocation


# 类初始化时注册
class HelloWorldWithParamsFunc(BaseFEELInvocation):
    class Meta:
        func_name = "hello world with params"  # FEEL 语法中调用的函数名

    def invoke(self, a, b, c=2, *args, **kwargs):
        return {"a": a, "b": b, "c": c, "args": args, "kwargs": kwargs}

b. 通过调用函数进行注册

from bkflow_feel.utils import FEELFunctionsManager


def func_with_params(a, b, c):
    return "With params: {}, {}, {}".format(a, b, c)


REGISTER_FUNCS = {
    "func with params": "path.to.func_with_params",  # FEEL 语法中调用的函数名 和 对应的函数路径
}
FEELFunctionsManager.register_funcs(REGISTER_FUNCS)  # 注册

自定义函数支持参数校验

如果通过第二种方式进行函数定义,可以通过定义 Inputs 类(继承 InvocationInputsModel)来定义函数的输入,并进行校验。

Inputs 类的定义和字段校验逻辑可参考 pydantic

同时,为了保证不具名传参的调用方式校验逻辑也能将各个位置的参数准确映射到对应的校验字段,需要在 Meta 类中定义对应的字段顺序。

示例如下:

from bkflow_feel.utils import BaseFEELInvocation, InvocationInputsModel

class FuncWithInputsValidation(BaseFEELInvocation):
    class Meta:
        func_name = "func with inputs validation"

    class Inputs(InvocationInputsModel):
        a: int
        b: int
        c: int
        d = 20

        class Meta:
            ordering = ["a", "b", "c", "d"]

    def invoke(self, a, b, *args, **kwargs):
        return {"a": a, "b": b, "args": args, "kwargs": kwargs}

函数调用

from bkflow_feel.api import parse_expression

parse_expression(expression="hello world with params(a:1,b:2)")  # {'a': 1, 'b': 2, 'c': 2, 'args': (), 'kwargs': {}}

parse_expression(expression="func with params(1,2,3)")  # With params: 1, 2, 3

支持语法详情

语法文档

benchmark

这里通过 pytest-benchmark 执行单测得到对应的解析性能结果:

可以看到,对于单测样例,bkflow-feel 的解析处理时间大致在 40+us - 200+us,换算成每秒可处理的简单表达式个数约为 5000 - 25000 个。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

bkflow_feel-1.1.2.tar.gz (12.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bkflow_feel-1.1.2-py2.py3-none-any.whl (13.2 kB view details)

Uploaded Python 2Python 3

File details

Details for the file bkflow_feel-1.1.2.tar.gz.

File metadata

  • Download URL: bkflow_feel-1.1.2.tar.gz
  • Upload date:
  • Size: 12.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.18 tqdm/4.64.1 importlib-metadata/4.8.3 keyring/23.4.1 rfc3986/1.5.0 colorama/0.4.5 CPython/3.6.8

File hashes

Hashes for bkflow_feel-1.1.2.tar.gz
Algorithm Hash digest
SHA256 c61459a7969c1b7541dcef6b1dbb44a92ad26965247c386fa6b531c9bc5a0214
MD5 304062768e8e74a349495dce80eb3f49
BLAKE2b-256 bd31cfd3878663e39d2beb1e1ec1167fe74b40b87feb5075be09267185867387

See more details on using hashes here.

File details

Details for the file bkflow_feel-1.1.2-py2.py3-none-any.whl.

File metadata

  • Download URL: bkflow_feel-1.1.2-py2.py3-none-any.whl
  • Upload date:
  • Size: 13.2 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.9.6 readme-renderer/34.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.18 tqdm/4.64.1 importlib-metadata/4.8.3 keyring/23.4.1 rfc3986/1.5.0 colorama/0.4.5 CPython/3.6.8

File hashes

Hashes for bkflow_feel-1.1.2-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 d93a43c1ef7f561bd1e5e316044a95e9284bcadd24a7a61fbe1b32a729498c80
MD5 1d8f9045eac9eaa28a68b10d69ad3c3e
BLAKE2b-256 592d087ab95298cb9c108ab304baf907f2e816949691eb84c1a4acd6d86f1e13

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page