Python:根据条件在语句(类对象)周围打印方括号



提醒一下,这不是家庭作业,这是我过去试图做的一篇论文,但我们没有提到如何"实际"做。

我们被赋予了一项任务,将"+"与"Const"一起实现为一组类,其想法是确定是否在表达式周围放置括号-例如:

eg1.Plus(Plus(Const(3),Const(4)),Const(5))应打印3+4+5

eg2.Plus(Const(3),Plus(Const(4),Const(5))应打印3+(4+5)

因此,我得出的结论是,我需要在str方法中使用一些东西来检查我的self.l或self.r中是否有多个"值",如果是,则分别在self.l和self.r周围打印括号。我相信是这样的,因为在eg2中,存在一个适用于多个常数的"加号"。如果我错了,请纠正我。

我不是想找人给我答案,而是想从哪里开始。我最近开始编码,发现很难弄清楚如何实现我想做的事情

class Expr :
pass

class Plus(Expr) :
def __init__(self,l,r) :
self.l = l
self.r = r

def __str__(self):
return str(self.l)+ "+" +str(self.r) #I believe here is where I need to implement.
class Const(Expr) :
def __init__(self,v) :
self.v = v
def __str__(self):
return str(self.v)

如有任何帮助,我们将不胜感激。


我的讲师给出了答案,但我对"par"的含义有点困惑——有人能帮助我理解为什么使用布尔值进行区分吗?

class Expr :
def __str__(self) :
return self.str_aux(False)
class Plus(Expr) :
def str_aux(self,par) :
s =self.l.str_aux(False)+"+"+self.r.str_aux(True)
if par :
return "("+s+")"
else :
return s
class Const(Expr) :
def __init__(self,v) :
self.v = v
def str_aux(self,par) :
return str(self.v)

规则非常简单:如果Plus的右手边本身就是Plus,则需要添加括号,否则就不需要。

至于检查是否存在self.lself.r,您应该使用isinstance来区分PlusConst

class Plus(Expr) :
def __init__(self,l,r) :
self.l = l
self.r = r
def __str__(self):
if isinstance(self.r, Plus):
return '{} + ({})'.format(self.l, self.r)
else:
return '{} + {}'.format(self.l, self.r)

示例

print(Plus(Const(3),Plus(Const(4),Const(5))))
print(Plus(Plus(Const(3),Const(4)),Const(5)))

输出

3 + (4 + 5)
3 + 4 + 5

关于讲师解决方案

您的讲师实现了与上述相同的解决方案,但委派任务为正在打印的对象添加括号。

方法str_aux的行为与__str__类似,只是它还采用了一个布尔参数par,该参数指示是否应打印圆括号。

示例

plus = Plus(Const(3), Const(4))
plus.str_aux(False) # "3+4"
plus.str_aux(True) # "(3+4)"

基本情况是打印Const时,str_aux忽略par而不打印括号。

最新更新