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

2024-03-29 09:53:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

number = 42
name = 'arthur'

if number != 42:
    if name == 'arthur':
        number = 42
else
    if name == 'zaphod':
        number = 0

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

我的想法是,上面的代码会转化为:

{'number':
    {'42':
        ['name': {'zaphod':0}],
     'other': 
         ['name':{'arthur':42}]
    }
}

基本上说,在进程结束时,可以从文件中读取if-else原理,并通过导航json找到正确的结果(如果存在的话)。你知道吗

我想看看是否有任何已知的方法来做这件事或一些文件的一个简单的方式去。你知道吗

谢谢


Tags: 文件代码namejson示例numberif进程
1条回答
网友
1楼 · 发布于 2024-03-29 09:53:11

听起来你在追求分层数据存储。。。你知道吗

也许值得研究一下XML and XPaths,仅仅是想一想你的情况,熟悉一些概念。你知道吗

使用JSON也可以做到这一点,比如使用JSONPath但是我建议先玩一下XML/xpath,因为它更清晰,而且是一种更成熟的技术。你知道吗


这是我脑海中的一个演示:

text.xml

<root>
    <condition var_name="number" op="not-equal" value="42">
        <condition var_name="name" op="equal" value="arthur">
            <result var_name="number" value="42"/>
        </condition>
    </condition>
    <condition op="default">
        <condition var_name="name" op="equal" value="zaphod">
            <result var_name="number" value="0"/>
        </condition>
    </condition>
</root>
#!/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

相关问题 更多 >