Python 计算表达式

Python 计算表达式,python,Python,我正在研究一个关于实现一个简单表达式求值方法的小编码问题 其他方法工作正常,但我一直得到“AttributeError:“float”对象没有属性“evaluation”。我想不出问题出在哪里 classbinop(Expr): 定义初始化(self,操作符,左:Expr,右:Expr): self.operator=运算符 self.left=左 self.right=right def评估(自我评估): 如果(self.operator==“+”): 返回编号(self.left.evalu

我正在研究一个关于实现一个简单表达式求值方法的小编码问题

其他方法工作正常,但我一直得到“AttributeError:“float”对象没有属性“evaluation”。我想不出问题出在哪里

classbinop(Expr):
定义初始化(self,操作符,左:Expr,右:Expr):
self.operator=运算符
self.left=左
self.right=right
def评估(自我评估):
如果(self.operator==“+”):
返回编号(self.left.evaluation()+self.right.evaluation())
其他:
如果(self.operator==“-”):
返回编号(self.left.evaluation()-self.right.evaluation())
其他:
如果(self.operator==“*”):
返回编号(self.left.evaluation()*self.right.evaluation())
其他:
如果(self.operator==“/”):
返回编号(self.left.evaluation()/self.right.evaluation())

您还没有给我们调用此功能的代码,但可能发生了以下情况:

left
right
不是
Expr
s,它们是
float
s。Python不会像这样强制执行类型强制—您在这里使用的符号(
left:Expr
)称为“类型暗示”,仅用于文档和API—在语言运行时不会以任何方式强制执行。如果有人

myOp = BinOp('+', 3.5, 4.8)
然后
BinOp()
被传递一个字符串和两个浮点-而不是
Expr
s。这与C语言不同,C语言可能会自动强制参数,Java语言可能会抛出编译时错误。在这一点上,错误是显而易见的-float没有
求值()
方法

我不知道您的
Expr
类来自何处,但您可能需要在
BinOp
构造函数中强制
left
right
Expr()

def __init__(self, op, left, right):
    self.operator = op
    self.left = Expr(left)
    self.right = Expr(right)

如果
Expr
是一个设计良好的数据结构,那么将实例传递给构造函数可能会产生一个副本,这就足以满足我们的需要了。

您还没有给我们调用它的代码,但可能发生了以下情况:

left
right
不是
Expr
s,它们是
float
s。Python不会像这样强制执行类型强制—您在这里使用的符号(
left:Expr
)称为“类型暗示”,仅用于文档和API—在语言运行时不会以任何方式强制执行。如果有人

myOp = BinOp('+', 3.5, 4.8)
然后
BinOp()
被传递一个字符串和两个浮点-而不是
Expr
s。这与C语言不同,C语言可能会自动强制参数,Java语言可能会抛出编译时错误。在这一点上,错误是显而易见的-float没有
求值()
方法

我不知道您的
Expr
类来自何处,但您可能需要在
BinOp
构造函数中强制
left
right
Expr()

def __init__(self, op, left, right):
    self.operator = op
    self.left = Expr(left)
    self.right = Expr(right)

如果
Expr
是一个设计良好的数据结构,那么将实例传递给构造函数可能会产生一个副本,这就足以满足我们的目的。

考虑使用
elif
减少缩进(请参见)。您能提供一个创建
BinOp
实例的示例吗?另外,什么是<代码> EXPR?考虑考虑使用<代码> ELIF < /C> >减少缩进(参见)。您能提供创建一个实例的例子吗?<代码> BinOp < /代码>?另外,什么是代码> EXPR< /代码>?考虑使用这正是我错过的地方。非常感谢你!问题只发生在我打电话给左右双方时,我很抱歉没有更好地澄清这一点,这更像是我不知道他们出了什么问题。这正是我错过的地方。非常感谢你!问题只发生在我打电话给左右双方时,我很抱歉没有更好地澄清这一点,这更像是我不知道他们出了什么问题。