python树函数_从表达式树创建python函数

我假设你的表达式树是由许多对象组成的,它们的类型对应于它是什么样的表达式。例如,Or,Equals,strings等,类似于:class OrExpression:

def __init__(self, left, right):

self.left = left

self.right = right

class EqualsExpression:

def __init__(self, left, right):

self.left = left

self.right = right

class Literal:

def __init__(self, value):

self.value = value

class Variable:

def __init__(self, name):

self.name = name

与示例等效的表达式如下所示:

^{pr2}$

您可以为每个为给定上下文计算自身的类创建一个方法eval。是这样的:class OrExpression:

def __init__(self, left, right):

self.left = left

self.right = right

def eval(self, variables):

return self.left.eval(variables) or self.right.eval(variables)

class EqualsExpression:

def __init__(self, left, right):

self.left = left

self.right = right

def eval(self, variables):

return self.left.eval(variables) == self.right.eval(variables)

class Literal:

def __init__(self, value):

self.value = value

def eval(self, variables):

return self.value

class Variable:

def __init__(self, name):

self.name = name

def eval(self, variables):

return variables[self.name]

然后可以调用eval并提供上下文。在您的示例中,您只需要传入element的值。在print e.eval({"element": "Apple"})

print e.eval({"element": "Duck"})

print e.eval({"element": "Banana"})

结果:True

True

False

但是,如果你不按类型区分不同的表达式呢?假设您的树由普通的旧节点组成,这些节点标识它们使用的value属性是什么类型的表达式。代码大致相同,只是使用一个单片开关,而不是单独的eval方法。在class Node:

def __init__(self, value=None, *children):

self.value = value

self.children = children

def evalTree(t, variables):

if t.value == "Or":

return evalTree(t.children[0], variables) or evalTree(t.children[1], variables)

elif t.value == "Equals":

return evalTree(t.children[0], variables) == evalTree(t.children[1], variables)

elif t.value == "Literal":

return t.children[0].value

elif t.value == "Variable":

name = t.children[0].value

else:

raise Exception("Unrecognized node type")

t = Node("Or",

Node("Equals",

Node("Variable", Node("element")),

Node("Literal", Node("Apple"))

),

Node("Or",

Node("Equals",

Node("Variable", Node("element")),

Node("Literal", Node("Apple"))

),

Node("Equals",

Node("Variable", Node("element")),

Node("Literal", Node("Apple"))

)

)

)

print evalTree(t,{"element": "Apple"})

print evalTree(t,{"element": "Duck"})

print evalTree(t,{"element": "Banana"})

结果:True

True

False

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值