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

时间:2017-04-04 15:30:45

标签: python if-statement

考虑这个(任意示例,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找到正确的结果(如果存在)。

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

由于

1 个答案:

答案 0 :(得分:1)

听起来你好像是在分层数据存储之后...

可能值得研究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