Олимпиадный тренинг

Задача . Свой мир. 06. Две записи о предмете


Задача

Темы:

Инвентарь показывает игроку «Алмаз x3». Отладочная консоль должна показывать другое: строку, по которой предмет можно создать заново. Одной записи на всё не хватает.

__str__ — для игрока, __repr__ — для разработчика: по нему видно, как объект создать. Печать списка идёт через __repr__, а не через __str__ — последняя строка тестов ровно про это.

Структура программы

Отправляется целая программа. Ниже — то, что в ней должно быть объявлено: имена классов, их родители и сигнатуры методов. Имена менять нельзя, проверки обращаются именно к ним.

class Item:
    def __init__(self, name, amount):
        self.name = name
        self.amount = amount

    def __str__(self):
        return f"{self.name} x{self.amount}"

    # TODO: __repr__ -> Item('Алмаз', 3)


class ToolItem(Item):
    def __init__(self, name, durability):
        super().__init__(name, 1)
        self.durability = durability

    def __str__(self):
        return f"{self.name} ({self.durability}%)"

    # TODO: __repr__ -> ToolItem('Кирка', 87)

Как проверяется

Проверяющая программа дописывает к твоему коду блок проверок и выполняет всё вместе. Задача засчитывается, если ни одна проверка не сработала и программа ничего не напечатала — отладочную печать перед отправкой убери.

Примеры проверок

#!requires Item: __str__, __repr__
#!requires ToolItem: __str__, __repr__

# подготовка
bag = [Item("Алмаз", 3), ToolItem("Кирка", 87)]

# проверка
assert str(bag[0]) == "Алмаз x3"
#!requires Item: __str__, __repr__
#!requires ToolItem: __str__, __repr__

# подготовка
bag = [Item("Алмаз", 3), ToolItem("Кирка", 87)]

# проверка
assert str(bag[1]) == "Кирка (87%)"

Строки #!requires — служебные: по ним система убеждается, что классы и методы действительно объявлены, а не подставлены обходным путём.

Вопрос: print(bag) печатает не то же самое, что print(bag[0]). Почему?

---


Примеры
№Входные данныеВыходные данные
1
#!requires Item: __str__, __repr__
#!requires ToolItem: __str__, __repr__

# подготовка
bag = [Item("Алмаз", 3), ToolItem("Кирка", 87)]

# проверка
assert str(bag[0]) == "Алмаз x3"

                         
2
#!requires Item: __str__, __repr__
#!requires ToolItem: __str__, __repr__

# подготовка
bag = [Item("Алмаз", 3), ToolItem("Кирка", 87)]

# проверка
assert str(bag[1]) == "Кирка (87%)"

                         
Статистика успешных решений по компиляторам
Комментарий учителя