【问题标题】:How do I get the JSON formof a Durable Rule in Python?如何在 Python 中获取持久规则的 JSON 形式?
【发布时间】:2021-03-20 06:37:30
【问题描述】:

我们的 Python 应用程序目前从 YAML 文件(即将成为数据库或 Redis 缓存)加载持久规则,然后将该 YAML 转换为 JSON,然后将 JSON 对象发送到持久规则引擎进行处理。

我正在重构此规则引擎服务,并希望在我的单元测试中使用 Python 版本的规则,基本上将 Durable README 示例合并到我们的引擎中。在 Python 中创建规则集后,如何将该规则集序列化为 JSON 对象?

下面是一个有效的 pytest 单元测试,除了最后一行,我想序列化规则。

最终目标是能够以 Python 格式(可读性)编写规则,然后将它们保存为 JSON(可读性较差)。


import pytest

from durable.lang import *
from durable.engine import Ruleset

# Tests derived from examples on Durable website.
printed_value = '?'
def mock_print(s):
  global printed_value
  printed_value = s
  return s

def test_hello(builder):
  global ruleset
  with ruleset('test_hello'):
    @when_all(m.subject == 'World')
    def say_hello(c):
      mock_print('Hello {0}'.format(c.m.subject))

  post('test_hello', { 'subject': 'World' })
  assert printed_value == 'Hello World'

  rule_as_json = ???

我什至找不到描述 Durbale 规则集 JSON 格式及其所有功能的位置。仅此文档就很有用。

更新 1:

我找到了durable支持的JSON结构的文档。 还是不知道怎么把python转成JSON。

https://github.com/jruizgit/rules/blob/master/docs/json/reference.md

更新 2:

终于找到了durable.lang库在源码中的位置:

libpy\durable\lang.py

此代码看起来很有希望遵循以更接近答案。

def post(ruleset_name, message, complete = None):
    return get_host().post(ruleset_name, message, complete)

【问题讨论】:

    标签: python json serialization durable-rules


    【解决方案1】:

    这里有一个解决方案:

    from durable.lang import *
    
    def test():
        # global ruleset
        with ruleset("test_hello"):
    
            @when_all(m.subject == "World")
            def say_hello(c):
                mock_print("Hello {0}".format(c.m.subject))
    
        post("test_hello", {"subject": "World"})
        assert printed_value == "Hello World"
    
        rule_as_json = get_host().get_ruleset("test_hello").get_definition()
        return rule_as_json
    

    并在iPython中执行:

    import durablejson as dj
    
    dj.test()
    {'r_0': {'all': [{'m': {'subject': 'World'}}]}}
    

    【讨论】:

      【解决方案2】:
      import json
      json_string = json.dumps({ 'key': 'value' })
      

      或保存到文件:

      import json
      with open("path/to/file", "w") as f:
          json.dump({ 'key': 'value' }, f)
      

      参考https://docs.python.org/3/library/json.html

      【讨论】:

      • 这似乎是将任何 Python 对象序列化为 JSON 字符串的一种方法。我需要一种将 Python 持久规则集转换为首选 JSON 形式的方法。为此,我需要 (1) 从 Durable 存储它的任何位置获取规则集对象,并 (2) 将其转换为 Durable 喜欢的专用 JSON 格式,这不是一个简单的序列化。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 2014-02-04
      相关资源
      最近更新 更多