我有一个Python AST解析器,可以将1==1 or 2==2 or 3==3
之类的表达式转换为这个字典:
{ 'args': [ {'args': [{'value': 1}, {'value': 1}], 'function': '=='},
{'args': [{'value': 2}, {'value': 2}], 'function': '=='},
{'args': [{'value': 3}, {'value': 3}], 'function': '=='}],
'function': 'or'}
然后将其转换为JSON并发布到API端点,但API只能理解二进制or
操作。因此,上面粘贴的字典需要转换(嵌套)到以下内容中:
{ 'args': [ { 'args': [ { 'args': [{'value': 1}, {'value': 1}],
'function': '=='},
{ 'args': [{'value': 2}, {'value': 2}],
'function': '=='}],
'function': 'or'},
{'args': [{'value': 3}, {'value': 3}], 'function': '=='}],
'function': 'or'}
由于BoolOp
有3个元素,因此无法从Python AST执行此操作,因此我认为最好以递归方式执行此操作。但是,我无法以正确的方式实现以递归方式迭代字典。
编辑:
字典可以深深嵌套,如:
{ 'args': [ {'args': [{'value': 1}, {'value': 1}], 'function': '=='},
{'args': [{'value': 2}, {'value': 2}], 'function': '=='},
{ 'args': [ { 'args': [{'value': 3}, {'value': 3}],
'function': '=='},
{ 'args': [{'value': 4}, {'value': 4}],
'function': '=='},
{ 'args': [{'value': 5}, {'value': 5}],
'function': '=='}],
'function': 'or'}],
'function': 'and'}
答案 0 :(得分:2)
你可以这样做:
def _nest_ors(args):
assert len(args) >= 2
if len(args) == 2:
return {
'function': 'or',
'args': args
}
return {
'function': 'or',
'args': [args[0], _nest_ors(args[1:])]
}
def fix_ors(ast):
assert ast['function'] == 'or'
return _nest_ors(ast['args'])
expression = {'args': [{'args': [{'value': 1}, {'value': 1}], 'function': '=='},
{'args': [{'value': 2}, {'value': 2}], 'function': '=='},
{'args': [{'value': 3}, {'value': 3}], 'function': '=='}],
'function': 'or'}
print(fix_ors(expression))
如果你有非常庞大的表达式,你将不得不用迭代解决方案替换递归。