Sobes.tech
Назад к вопросам
Senior
2

class ATM(SKD): def __init__(self, atm_api: "SKD"): self.atm_api: SKD = atm_api self.bills_count: dict[int:int] = {bill: self.atm_api.count_banknotes(bill) for bill in BILLS} def withdraw(self, amount: int) -> bool: bills_plan: dict[int: int] = {} remaining = amount for bill in BILLS: available = self.bills_count[bill] take = min(remaining // bill, available) if take > 0: bills_plan[bill] = take remaining -= take * bill if remaining != 0: return False bills_count_const = {50: 0, 100: 2, 500: 0, 1000: 0, ...}, expected = True @pytest.mark.parametrize( "bills_count_const,expected", [ ({5000: 0, 1000: 0, 500: 0, 100: 0, 50: 0}, False), ({5000: 100, 1000: 100, 500: 100, 100: 100, 50: 100}, True), ({5000: 1, 1000: 0, 500: 0, 100: 2, 50: 0}, True) ] ) def test_false(bills_count_const, expected): atm = ATM(FakeSDK()) atm.bills_count = bills_count_const amount = 1000 res = atm.withdraw(amount) assert res == expected

Компании, где спрашивали
Яндекс

Ответ от нейросети

sobes.tech AI

В представленном коде класс ATM реализует логику снятия наличных с банкомата, используя доступные купюры. Метод withdraw пытается составить план выдачи суммы amount, начиная с самых крупных купюр, уменьшая остаток на сумму выданных купюр.

Тесты с помощью pytest проверяют корректность работы метода withdraw при разных состояниях наличия купюр (bills_count_const) и ожидаемом результате (True/False).

Ключевые моменты:

  • Метод withdraw возвращает False, если невозможно выдать точную сумму из имеющихся купюр.
  • Тесты параметризованы, что позволяет проверить разные сценарии без дублирования кода.

Пример использования параметризации в pytest:

import pytest

@pytest.mark.parametrize(
    "bills_count_const,expected",
    [
        ({5000: 0, 1000: 0, 500: 0, 100: 0, 50: 0}, False),
        ({5000: 100, 1000: 100, 500: 100, 100: 100, 50: 100}, True),
        ({5000: 1, 1000: 0, 500: 0, 100: 2, 50: 0}, True)
    ]
)
def test_withdraw(bills_count_const, expected):
    atm = ATM(FakeSDK())
    atm.bills_count = bills_count_const
    amount = 1000
    assert atm.withdraw(amount) == expected

Такой подход позволяет легко расширять тесты и поддерживать качество кода.