Repository navigation
2. Пенская Алина Павловна. 613 #88
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
e16319f
4580922
3bd6743
894a804
da1a284
9eb51cf
ff14758
c6aa5e5
4d22213
18cdca8
cd4f0ed
bfaa64b
fc2b9e3
0ac733b
f2e1b1f
8744b22
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -9,10 +9,10 @@ | |
| an explanatory message to stdout and returns ``None``. | ||
| """ | ||
|
|
||
| from typing import Final | ||
| from typing import Final, cast | ||
|
|
||
| from .crud import read_product, update_product # noqa: F401 | ||
| from .storage import ( # noqa: F401 | ||
| from .crud import read_product, update_product | ||
| from .storage import ( | ||
| NAME_INDEX, | ||
| PRICE_INDEX, | ||
| QUANTITY_INDEX, | ||
|
|
@@ -24,7 +24,21 @@ | |
|
|
||
| # TODO: задайте позиции полей внутри кортежа CartLine | ||
| LINE_PRODUCT_ID_INDEX: Final = 0 | ||
| LINE_QUANTITY_INDEX: Final = 0 | ||
| LINE_QUANTITY_INDEX: Final = 1 | ||
|
|
||
|
|
||
| def make_cart(product_id: int, quantity: int) -> CartLine: # переставлять | ||
| fields: list[int] = [0] * 2 | ||
| fields[LINE_PRODUCT_ID_INDEX] = product_id | ||
| fields[LINE_QUANTITY_INDEX] = quantity | ||
| return cast(CartLine, tuple(fields)) | ||
|
|
||
|
|
||
| def find_cart_line(cart: list[CartLine], product_id: int) -> CartLine | None: | ||
| for line in cart: | ||
| if line[LINE_PRODUCT_ID_INDEX] == product_id: | ||
| return line | ||
| return None | ||
|
|
||
|
|
||
| def add_to_cart( | ||
|
|
@@ -54,7 +68,31 @@ def add_to_cart( | |
| when the product is unknown or the store cannot cover the request. | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return (0, 0) | ||
| product = read_product(storage, product_id) | ||
| if product: | ||
| if product[QUANTITY_INDEX] < quantity: | ||
| print( | ||
| f"not enough stock for product {product_id}: {product[QUANTITY_INDEX]} available, {quantity} requested" | ||
| ) | ||
| return None | ||
| product = update_product( | ||
| storage, | ||
| product_id, | ||
| ( | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Когда ruff делает такие страшные вещи, то стоит задуматься над тем, чтобы вынести какие-то вычисления на отдельные строки (в данном случае можно было бы создать кортеж и положить его в переменную) |
||
| product[NAME_INDEX], | ||
| product[PRICE_INDEX], | ||
| product[QUANTITY_INDEX] - quantity, | ||
| ), | ||
| ) | ||
| for line in cart: | ||
| if line[LINE_PRODUCT_ID_INDEX] == product_id: | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Тут лучше было бы использовать |
||
| new_line = make_cart(product_id, line[LINE_QUANTITY_INDEX] + quantity) | ||
| cart[cart.index(line)] = new_line | ||
| return new_line | ||
| new_line = make_cart(product_id, quantity) | ||
| cart.append(new_line) | ||
| return new_line | ||
| return None | ||
|
|
||
|
|
||
| def remove_from_cart( | ||
|
|
@@ -86,4 +124,32 @@ def remove_from_cart( | |
| line for the product or holds too few units. | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return (0, 0) | ||
| line = find_cart_line(cart, product_id) | ||
| if line is None: | ||
| print(f"product {product_id} is not in the cart") | ||
| return None | ||
| if line[LINE_QUANTITY_INDEX] < quantity: | ||
| print( | ||
| f"cart holds only {line[LINE_QUANTITY_INDEX]} unit(s) " | ||
| f"of product {product_id}, cannot remove {quantity}" | ||
| ) | ||
| return None | ||
| product = read_product(storage, product_id) | ||
| if product is None: | ||
| return None | ||
| update_product( | ||
| storage, | ||
| product_id, | ||
| ( | ||
| product[NAME_INDEX], | ||
| product[PRICE_INDEX], | ||
| product[QUANTITY_INDEX] + quantity, | ||
| ), | ||
| ) | ||
| new_quantity = line[LINE_QUANTITY_INDEX] - quantity | ||
| if new_quantity == 0: | ||
| cart.remove(line) | ||
| return make_cart(product_id, 0) | ||
| new_line = make_cart(product_id, new_quantity) | ||
| cart[cart.index(line)] = new_line | ||
| return new_line | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -13,14 +13,31 @@ | |
| """ | ||
|
|
||
| from decimal import Decimal | ||
| from typing import cast | ||
|
|
||
| from .storage import ( # noqa: F401 | ||
| from .storage import ( | ||
| NAME_INDEX, | ||
| PRICE_INDEX, | ||
| PRODUCT_ID_INDEX, | ||
| PRODUCT_ID_MIN, | ||
| QUANTITY_INDEX, | ||
| Product, | ||
| ) | ||
| from .utils import normalize_price # noqa: F401 | ||
| from .utils import normalize_price | ||
|
|
||
|
|
||
| def make( # чтобы можно было переставлять | ||
| product_id: int, | ||
| name: str, | ||
| price: Decimal, | ||
| quantity: int, | ||
| ) -> Product: | ||
| fields: list[int | str | Decimal] = [0] * 4 | ||
| fields[PRODUCT_ID_INDEX] = product_id | ||
| fields[NAME_INDEX] = name | ||
| fields[PRICE_INDEX] = price | ||
| fields[QUANTITY_INDEX] = quantity | ||
| return cast(Product, tuple(fields)) | ||
|
|
||
|
|
||
| def generate_product_id(storage: list[Product]) -> int: | ||
|
|
@@ -35,7 +52,12 @@ def generate_product_id(storage: list[Product]) -> int: | |
| empty. | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return 0 | ||
| if not storage: | ||
| return PRODUCT_ID_MIN | ||
| max_id = 0 | ||
| for product in storage: | ||
| max_id = max(max_id, product[PRODUCT_ID_INDEX]) | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Тут кстати можно было бы сделать так: max_id = max(product[PRODUCT_ID_INDEX] for product in storage) |
||
| return max_id + 1 | ||
|
|
||
|
|
||
| def create_product( | ||
|
|
@@ -57,7 +79,15 @@ def create_product( | |
| name is printed. | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return 0 | ||
| name, price, quantity = fields | ||
| for product in storage: | ||
| if product[NAME_INDEX] == name: | ||
| print(f"product name '{name}' is already taken") | ||
| return None | ||
| product_id = generate_product_id(storage) | ||
| normalized_price = normalize_price(price) | ||
| storage.append(make(product_id, name, normalized_price, quantity)) | ||
| return product_id | ||
|
|
||
|
|
||
| def read_product(storage: list[Product], product_id: int) -> Product | None: | ||
|
|
@@ -73,7 +103,11 @@ def read_product(storage: list[Product], product_id: int) -> Product | None: | |
| printed in that case). | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return (0, "", Decimal(0), 0) | ||
| for product in storage: | ||
| if product[PRODUCT_ID_INDEX] == product_id: | ||
| return product | ||
| print(f"no product with id {product_id}") | ||
| return None | ||
|
|
||
|
|
||
| def update_product( | ||
|
|
@@ -100,7 +134,16 @@ def update_product( | |
| left unchanged and a message is printed). | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return (0, "", Decimal(0), 0) | ||
| name, price, quantity = fields | ||
| price = normalize_price(price) | ||
| for i in range(len(storage)): | ||
| product = storage[i] | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Чтобы такое не писать, надо использовать |
||
| if product[PRODUCT_ID_INDEX] == product_id: | ||
| updated_product = make(product_id, name, price, quantity) | ||
| storage[i] = updated_product | ||
| return updated_product | ||
| print(f"no product with id {product_id}") | ||
| return None | ||
|
|
||
|
|
||
| def delete_product(storage: list[Product], product_id: int) -> int | None: | ||
|
|
@@ -117,4 +160,9 @@ def delete_product(storage: list[Product], product_id: int) -> int | None: | |
| a message is printed). | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return 0 | ||
| for product in storage: | ||
| if product[PRODUCT_ID_INDEX] == product_id: | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Цикл: for index, product in enumerate(storage):
if product[PRODUCT_ID_INDEX] == product_id:встречается несколько раз, лучше было бы использовать везде |
||
| storage.remove(product) | ||
| return product_id | ||
| print(f"no product with id {product_id}") | ||
| return None | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Лучше не экономить строки и оставлять пробелы (пустые строки) между логическими блоками. Так читабельность кода улучшается.