Python 如何将if-else代码转换为json(或其他)格式?

Python 如何将if-else代码转换为json(或其他)格式?,python,if-statement,Python,If Statement,考虑以下代码(任意示例,python语法): 我想以某种方式将其转换为某种格式,以便将其保存为文件。 我最初的想法是使用json,但这不是一个具体的要求 我的想法是,上述代码将转换为如下内容: {'number': {'42': ['name': {'zaphod':0}], 'other': ['name':{'arthur':42}] } } 基本上说,在流程结束时,可以从文件中读取if-else基本原理,并通过导航json找到

考虑以下代码(任意示例,python语法):

我想以某种方式将其转换为某种格式,以便将其保存为文件。
我最初的想法是使用json,但这不是一个具体的要求

我的想法是,上述代码将转换为如下内容:

{'number':
    {'42':
        ['name': {'zaphod':0}],
     'other': 
         ['name':{'arthur':42}]
    }
}
基本上说,在流程结束时,可以从文件中读取
if
-
else
基本原理,并通过导航json找到正确的结果(如果存在)

我想看看是否有任何已知的方法可以做到这一点,或者有一些简单方法的文档


谢谢

听起来你在追求分层数据存储

这可能是值得研究的,只是想一想你的情况,并熟悉一些概念

使用JSON也可以做到这一点,但我建议先玩一下XML/XPath,因为它更清晰,是一种更成熟的技术


这是一个演示我想做的事情:

text.xml


#/usr/bin/env蟒蛇3
从pprint导入pprint
将xml.etree.ElementTree作为ET导入
#手术
ops={
“相等”:lambda数据,变量名,值:data[var\u name]==value,
“不相等”:lambda数据,变量名称,值:data[var\u name]!=value,
}
def el_get(el,属性名称):
value=el.get(属性名称)
尝试:
value=int(value)#尝试为演示强制使用数字。。。
除:
通过
返回值
def dig(根目录,数据):
#获取任何结果,并将其应用于数据
对于root.findall('./结果[@var_name][@value]')中的el:
var\u name=el\u get(el,'var\u name')
value=el_get(el,‘value’)
如果变量名称不在数据中:
引发异常('错误的变量名称(%s)'(变量名称))
数据[var_name]=值
#运行条件,使用第一个匹配的条件运行
对于root.findall('./条件[@var_name][@op][@value]')中的el:
op=el_get(el,'op')
如果op不在ops中:
引发异常('错误操作(%s)'(op))
var\u name=el\u get(el,'var\u name')
value=el_get(el,‘value’)
如果变量名称不在数据中:
引发异常('错误的变量名称(%s)'(变量名称))
结果=操作[op](数据、变量名称、值)
如果结果为真:
挖掘(el,数据)
返回
#运行默认值,取第一个
对于root.findall('./条件[@op=“default”]')中的el:
挖掘(el,数据)
返回
返回
#抓住XML
root=ET.parse('test.xml').getroot()
#加工与印刷
数据={'number':21,'name':'arthur'}
挖掘(根,数据)
pprint(数据)#通过
#加工与印刷
数据={'number':21,'name':'zaphod'}
挖掘(根,数据)
pprint(数据)#通过
#加工与印刷
数据={'number':42,'name':'arthur'}
挖掘(根,数据)
pprint(数据)#通过
#加工与印刷
数据={'number':42,'name':'zaphod'}
挖掘(根,数据)
pprint(数据)#通过

为什么不将其保留为Python并导入?如果将其存储为某种类型的.py文件会怎么样。真的吗?我同意上面的评论,但是在您的示例中,您需要为每个条件使用一个对象数组,以便在反序列化时保留顺序。最好的做法是将所有重要数据存储为值,并保留键作为这些值的描述符。添加注释,因为这不是一个完整的答案:尝试
ast
module。类似于:
res=ast.parse(打开(“您的/file/path”).read())
。然后可以得到如下内容:
res.body[2]。test.comparators[0]。n
==42。我没有广泛使用过这个模块。我继续在res层次结构上执行dir(…)。也许你能把它翻译成JSON。往另一个方向走应该相对容易些。祝你好运:)@zondo,我的想法是我可以将逻辑保存在一个文件中,然后从一个源中检索到不同用途的逻辑。@SuperSaiyan我已经实现了一个演示
{'number':
    {'42':
        ['name': {'zaphod':0}],
     'other': 
         ['name':{'arthur':42}]
    }
}
#!/usr/bin/env python3

from pprint import pprint
import xml.etree.ElementTree as ET

# the <conditional> operations
ops = {
    'equal': lambda data, var_name, value: data[var_name] == value,
    'not-equal': lambda data, var_name, value: data[var_name] != value,
}

def el_get(el, attr_name):
    value = el.get(attr_name)
    try:
        value = int(value) # try to force numerics for the demo...
    except:
        pass
    return value

def dig(root, data):
    # get any results, and apply them to the data
    for el in root.findall('./result[@var_name][@value]'):
        var_name = el_get(el, 'var_name')
        value = el_get(el, 'value')

        if var_name not in data:
            raise Exception('bad var_name (%s)' % ( var_name ))

        data[var_name] = value

    # run through the conditions, running with the first that matches
    for el in root.findall('./condition[@var_name][@op][@value]'):
        op = el_get(el, 'op')

        if op not in ops:
            raise Exception('bad operation (%s)' % ( op ))

        var_name = el_get(el, 'var_name')
        value = el_get(el, 'value')

        if var_name not in data:
            raise Exception('bad var_name (%s)' % ( var_name ))

        result = ops[op](data, var_name, value)

        if result is True:
            dig(el, data)
            return

    # run through the defaults, taking the first
    for el in root.findall('./condition[@op="default"]'):
        dig(el, data)
        return

    return

# grab the XML
root = ET.parse('test.xml').getroot()

# process & print
data = { 'number': 21, 'name': 'arthur' }
dig(root, data)
pprint(data) # pass

# process & print
data = { 'number': 21, 'name': 'zaphod' }
dig(root, data)
pprint(data) # pass

# process & print
data = { 'number': 42, 'name': 'arthur' }
dig(root, data)
pprint(data) # pass

# process & print
data = { 'number': 42, 'name': 'zaphod' }
dig(root, data)
pprint(data) # pass