Python: печать скобок вокруг операторов (объектов классов) на основе условий - PullRequest
0 голосов
/ 04 января 2019

Просто напоследок, это не домашняя работа, это из прошлой статьи, которую я пытаюсь сделать, но у нас нет никаких ссылок на то, как «на самом деле» это сделать.

Нам была дана задача реализовать '+' вместе с 'Const' как набор классов, с идеей выяснить, следует ли заключать скобки вокруг выражения или нет - например:

EG1. Плюс (Плюс (Const (3), Const (4)), Const (5)) должен печатать 3 + 4 + 5

ЭГ2. Плюс (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)

Любая помощь будет принята с благодарностью.


Мой лектор дал ответ, но меня немного смутило значение «номинал» - может ли кто-нибудь помочь мне понять, почему значения bool используются для дифференциации?

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)

1 Ответ

0 голосов
/ 04 января 2019

Правило довольно простое: если правая часть Plus сама является Plus, то вы хотите добавить круглые скобки, в противном случае - нет.

Что касается проверки, существуют ли self.l и self.r, вы должны использовать isinstance, чтобы различать Plus и Const.

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 и не печатает скобки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...