Repository navigation
2. Пятина Эвелина Павловна. 613 #43
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
Changes from all commits
bb50b34
7404257
3fe8f20
028db1a
f9900fd
3de0232
e5cbc4d
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 |
|---|---|---|
|
|
@@ -13,13 +13,16 @@ | |
| :func:`decode_node_id` and :func:`decode_sequence_id`. | ||
| """ | ||
|
|
||
| import time # noqa: F401 | ||
| import time | ||
|
|
||
| from .constants import ( # noqa: F401 | ||
| from .constants import ( | ||
| EPOCH_MS_DEFAULT, | ||
| NODE_ID_BITS, | ||
| NODE_ID_DEFAULT, | ||
| NODE_ID_MAX, | ||
| SEQUENCE_ID_BITS, | ||
| SEQUENCE_ID_MAX, | ||
| TIMESTAMP_BITS, | ||
| TIMESTAMP_MS_MAX, | ||
| ) | ||
|
|
||
|
|
@@ -35,7 +38,7 @@ def read_current_millis(epoch_ms: int) -> int: | |
| negative if ``epoch_ms`` lies in the future. | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return 0 | ||
| return int(time.time() * 1000 - epoch_ms) | ||
|
|
||
|
|
||
| def decode_timestamp_ms(snowflake_id: int, epoch_ms: int = EPOCH_MS_DEFAULT) -> int: | ||
|
|
@@ -51,7 +54,8 @@ def decode_timestamp_ms(snowflake_id: int, epoch_ms: int = EPOCH_MS_DEFAULT) -> | |
| generated. | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return 0 | ||
| timestamp_ms = (snowflake_id >> 22) & (2**TIMESTAMP_BITS - 1) | ||
| return int(timestamp_ms + epoch_ms) | ||
|
|
||
|
|
||
| def decode_node_id(snowflake_id: int) -> int: | ||
|
|
@@ -65,7 +69,7 @@ def decode_node_id(snowflake_id: int) -> int: | |
| ``[0, NODE_ID_MAX]``. | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return 0 | ||
| return int((snowflake_id >> 12) & (2**NODE_ID_BITS - 1)) | ||
|
|
||
|
|
||
| def decode_sequence_id(snowflake_id: int) -> int: | ||
|
|
@@ -79,7 +83,7 @@ def decode_sequence_id(snowflake_id: int) -> int: | |
| the range ``[0, SEQUENCE_ID_MAX]``. | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return 0 | ||
| return int(snowflake_id & (2**SEQUENCE_ID_BITS - 1)) | ||
|
|
||
|
|
||
| def generate_snowflake_id( | ||
|
|
@@ -111,4 +115,17 @@ def generate_snowflake_id( | |
| cases an explanatory message is printed to stdout first. | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return 0 | ||
| if node_id < 0 or NODE_ID_MAX < node_id: | ||
| print(f"node_id must be in [{0}; {NODE_ID_MAX}]") | ||
|
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 0 < sequence_id or sequence_id < SEQUENCE_ID_MAX: | ||
|
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. Тут как будто знак больше должен быть: 0 < sequence_id or sequence_id > SEQUENCE_ID_MAX |
||
| print(f"node_id must be in [{0}; {NODE_ID_MAX}]") | ||
|
|
||
| timestamp_ms = int(time.time() * 1000 - epoch_ms) | ||
| if timestamp_ms > TIMESTAMP_MS_MAX: | ||
| print("overflows") | ||
| return None | ||
|
|
||
| snowflake_id = (0b0 << 63) | (timestamp_ms << 22) | (node_id << 12) | (sequence_id) | ||
|
|
||
| return int(snowflake_id) | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -11,8 +11,8 @@ | |
|
|
||
| from typing import Final | ||
|
|
||
| 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,17 @@ | |
|
|
||
| # TODO: задайте позиции полей внутри кортежа CartLine | ||
| LINE_PRODUCT_ID_INDEX: Final = 0 | ||
| LINE_QUANTITY_INDEX: Final = 0 | ||
| LINE_QUANTITY_INDEX: Final = 1 | ||
|
|
||
|
|
||
| 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 +64,36 @@ 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 is None: | ||
| return None | ||
|
|
||
| stock_quantity = product[QUANTITY_INDEX] | ||
| if stock_quantity < quantity: | ||
| print( | ||
| f"not enough stock for product {product_id}: {stock_quantity} available, {quantity} requested" | ||
| ) | ||
| return None | ||
|
|
||
| new_stock_quantity = stock_quantity - quantity | ||
| update_product( | ||
| storage, | ||
| product_id, | ||
| (product[NAME_INDEX], product[PRICE_INDEX], new_stock_quantity), | ||
| ) | ||
|
|
||
| index = 0 | ||
| for line in cart: | ||
| if line[LINE_PRODUCT_ID_INDEX] == product_id: | ||
| updated_product = (product_id, line[LINE_PRODUCT_ID_INDEX] + quantity) | ||
|
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. Вы используете |
||
| cart[index] = updated_product | ||
|
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. Кажется вы не меняете |
||
| return updated_product | ||
|
|
||
| new_line = (product_id, quantity) | ||
| cart.append(new_line) | ||
|
|
||
| return new_line | ||
|
|
||
|
|
||
| def remove_from_cart( | ||
|
|
@@ -86,4 +125,33 @@ 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 | ||
|
|
||
| cart_quantity = line[LINE_QUANTITY_INDEX] | ||
| if cart_quantity < quantity: | ||
| print( | ||
| f"cart holds only {cart_quantity} unit(s) 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 = cart_quantity - quantity | ||
| for index in range(len(cart)): | ||
| if cart[index][LINE_PRODUCT_ID_INDEX] == product_id: | ||
| if new_quantity == 0: | ||
| del cart[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. Это уже вкусовщина, но мне больше нравится удалять через |
||
| return (product_id, 0) | ||
| updated_product = (product_id, new_quantity) | ||
| cart[index] = updated_product | ||
| return updated_product | ||
| return None | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -14,13 +14,13 @@ | |
|
|
||
| from decimal import Decimal | ||
|
|
||
| from .storage import ( # noqa: F401 | ||
| from .storage import ( | ||
| NAME_INDEX, | ||
| PRODUCT_ID_INDEX, | ||
| PRODUCT_ID_MIN, | ||
| Product, | ||
| ) | ||
| from .utils import normalize_price # noqa: F401 | ||
| from .utils import normalize_price | ||
|
|
||
|
|
||
| def generate_product_id(storage: list[Product]) -> int: | ||
|
|
@@ -35,7 +35,9 @@ def generate_product_id(storage: list[Product]) -> int: | |
| empty. | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return 0 | ||
| if not storage: | ||
| return PRODUCT_ID_MIN | ||
| return max(product[PRODUCT_ID_INDEX] for product in storage) + 1 | ||
|
|
||
|
|
||
| def create_product( | ||
|
|
@@ -57,7 +59,17 @@ 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((product_id, name, normalized_price, quantity)) | ||
| return product_id | ||
|
|
||
|
|
||
| def read_product(storage: list[Product], product_id: int) -> Product | None: | ||
|
|
@@ -73,7 +85,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}") | ||
|
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. Сообщение пишется каждую итерацию |
||
| return None | ||
|
|
||
|
|
||
| def update_product( | ||
|
|
@@ -99,8 +115,18 @@ def update_product( | |
| ``None`` when no product carries that identifier (``storage`` is | ||
| left unchanged and a message is printed). | ||
| """ | ||
| name, price, quantity = fields | ||
| normalized_price = normalize_price(price) | ||
|
|
||
| # TODO: реализуйте функцию | ||
| return (0, "", Decimal(0), 0) | ||
|
|
||
| for index, product in enumerate(storage): | ||
|
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:встречается 3 раза, лучше было бы поиск вынести в отдельную функцию. Код был бы понятнее. |
||
| if product[PRODUCT_ID_INDEX] == product_id: | ||
| updated_product = (product_id, name, normalized_price, quantity) | ||
| storage[index] = 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 +143,9 @@ def delete_product(storage: list[Product], product_id: int) -> int | None: | |
| a message is printed). | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return 0 | ||
| for index, product in enumerate(storage): | ||
| if product[PRODUCT_ID_INDEX] == product_id: | ||
| del storage[index] | ||
| 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.
Магические константы усложняют понимание кода.
Пункт S3, минус балл.