@makds344

Не понимаю в чем ошибка, можете помочь?

spoiler
Вам предстоит написать программу, которая будет:
хранить перечень продуктов, их количество и срок годности;
позволит добавлять новые продукты в перечень продуктов;
позволит получать информацию о содержимом холодильника.
goods = {
    'Пельмени Универсальные': [
        # Первая партия продукта 'Пельмени Универсальные':
        {'amount': Decimal('0.5'), 'expiration_date': datetime.date(2023, 7, 15)},
        # Вторая партия продукта 'Пельмени Универсальные':
        {'amount': Decimal('2'), 'expiration_date': datetime.date(2023, 8, 1)},
    ],
    'Вода': [
        {'amount': Decimal('1.5'), 'expiration_date': None}
    ],
}

Опишите функции add(), add_by_note(), find(), amount() и expire().
С чего начать
Не пытайтесь сделать всю работу одновременно: выполняйте её по шагам.
Объявите словарь goods, добавьте в него пару продуктов — их можно скопировать из приведённых примеров.
Займитесь функцией add() — научите её добавлять продукты в словарь. Протестируйте работу этой функции и переходите к следующей. На каждом этапе перечитывайте подсказки и описания, относящиеся к функции, над которой вы работаете.
Каждую готовую функцию вызовите несколько раз с разными аргументами:
с необязательными аргументами и без них,
со вчерашней и завтрашней датой (через сто лет — тоже попробуйте),
передайте в add() и add_by_note() новые продукты и те, что уже есть в словаре goods.
Тестирование программы — значительная и обязательная часть работы, не пренебрегайте ей.
Подсказки
Формат даты можно определить константой DATE_FORMAT = '%Y-%m-%d'.
Функция add().
Проверить, есть ли название продукта (title) в словаре items.
Преобразовать строку с датой в тип date с помощью модуля datetime.
Применить list.append() для добавления словаря с ключами 'amount' и 'expiration_date' в список партий продукта с конкретным title.
Функция add_by_note().
Разделить строку на части по пробелам с помощью str.split.
Определить, является ли последняя часть строки датой.
Ту часть строки, где указано количество продукта, конвертировать в число типа Decimal
Оставшуюся часть строки объединить, чтобы получить название продукта: если название состояло из нескольких слов — функция str.split разобъёт его на части.
Вызвать функцию add(), передав в неё получившиеся данные — название, количество и срок хранения.
Функция find().
Перебрать ключи словаря.
При переборе применить к ключам функцию lower, чтобы провести поиск без учёта регистра.
Найденные названия продуктов добавить в список с результатами поиска при помощи функции append.
Функция amount().
Применить функцию find() для получения списка подходящих товаров.
Суммировать значения amount найденных продуктов для вычисления количества каждого найденного товара.
Функция expire().
Получить текущую дату с помощью datetime.date.today().
Добавить количество дней из запроса к текущей дате.
Перебрать все партии продукта и для каждой проверить, истекает ли срок годности: сравнить его с текущей датой и с датой истечения срока годности.

import datetime
from decimal import Decimal

DATE_FORMAT = '%Y-%m-%d'

goods = {}

def add(items, title, amount, expiration_date=None):
    if title not in items:
        items[title] = []
    expiration_date = datetime.datetime.strptime(
        expiration_date,
        DATE_FORMAT
    ).date() if expiration_date else expiration_date
    items[title].append({'amount': amount, 'expiration_date': expiration_date})

def add_by_note(items, note):
    parts = note.split(' ')
    if len(parts[-1].split('-')) == 3:
        expiration_date = parts[-1]
        good_amount = Decimal(parts[-2])
        title = ' '.join(parts[0:-2])
        add(items, title, good_amount, expiration_date)

def find(items, needle):
    for item in items:
        if item['title'] == needle:
            return item

def amount(items, needle):
    total_amount = 0
    if needle in items:
        for item in items[needle]:
            total_amount += item['amount']
    return total_amount

def expire(items, in_advance_days=0):
    results = {}
    for title, details in items.items():
        if title.lower() in needle.lower():
            results[title] = details
    return results

add(goods, 'Мясо', 70, '2024-05-17')
add_by_note(goods, 'Яца Фабрики №1 4 2023-07-15')
add(goods, 'Яйца', 3.5, '2024-07-15')
print(goods)
  • Вопрос задан
  • 270 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Не обработан случай, когда в конце строки нет даты.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы