Skip to content

Commit 6b82ea1

Browse files
author
Gennadii Kandaurov
committed
add lesson #2 slides, hw
1 parent 1a497de commit 6b82ea1

File tree

2 files changed

+108
-0
lines changed

2 files changed

+108
-0
lines changed

lesson-02/homework.md

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
# Домашнее задание #02 (функции)
2+
3+
### 1. Функция для обработки json
4+
Функция для обработки должна принимать параметры:
5+
- строку с json;
6+
- список ключей, которые необходимо обработать;
7+
- список токенов, которые нужно найти;
8+
- функцию-обработчик ключа и токена.
9+
10+
json для задания всегда имеет вид словаря с ключами и значениями из строк. Строки-значения в json содержат произвольное число пробелов в качестве разделителей слов, знаков препинания нет.
11+
12+
Все токены и ключи состоят только из букв и цифр без пробельных символов.
13+
14+
Функция парсит строку с json библиотечными средствами.
15+
Для каждого ключа json, который совпадает с одним из переданных ключей для обработки, функция должна искать вхождения токенов в строку-значение по данному ключу.
16+
Для каждого найденного токена должна быть вызвана функция-обработчик с ключом и токеном.
17+
18+
Поиск ключей должен зависеть от регистра, а поиск токенов должен быть регистронезависимым.
19+
20+
21+
```py
22+
def process_json(
23+
json_str: str,
24+
required_keys: list[str] | None = None,
25+
tokens: list[str] | None = None,
26+
callback: Callable[[str, str], None] | None = None,
27+
) -> None:
28+
...
29+
30+
31+
# например:
32+
json_str = '{"key1": "Word1 word2", "key2": "word2 word3"}'
33+
required_keys = ["key1", "KEY2"]
34+
tokens = ["WORD1", "word2"]
35+
36+
process_json(json_str, required_keys, tokens, lambda key, token: f"{key=}, {token=}")
37+
38+
# выведет:
39+
# key="key1", token="WORD1"
40+
# key="key1", token="word2"
41+
```
42+
43+
### 2. Параметризуемый декоратор для логирования вызовов и перезапуска функций в случае ошибок
44+
Декоратор `retry_deco` должен:
45+
- принимать опциональными параметрами число перезапусков декорируемой функции и список ожидаемых классов исключений;
46+
- при вызове функции логировать (выводить) название функции, все переданные ей аргументы, номер попытки перезапуска, результат работы функции и ошибку, если было выброшено исключение;
47+
формат логирования произвольный (например, функция и аргументы один раз, а номер попытки и исключение/результат сколько потребуется);
48+
- в случае исключения при выполнении функции декоратор должен выполнить новую попытку запуска функции, пока не достигнет заданного числа перезапусков;
49+
если исключение из списка ожидаемых классов исключений (параметр декоратора), то перезапускать функцию не надо, тк исключения из списка это нормальный режим работы декорируемой функции.
50+
51+
```py
52+
def retry_deco(...):
53+
...
54+
55+
56+
@retry_deco(3)
57+
def add(a, b):
58+
return a + b
59+
60+
61+
add(4, 2)
62+
# run "add" with positional args = (4, 2), attempt = 1, result = 6
63+
64+
add(4, b=3)
65+
# run "add" with positional args = (4,), keyword kwargs = {"b": 3}, attempt = 1, result = 7
66+
67+
68+
@retry_deco(3)
69+
def check_str(value=None):
70+
if value is None:
71+
raise ValueError()
72+
73+
return isinstance(value, str)
74+
75+
76+
check_str(value="123")
77+
# run "check_str" with keyword kwargs = {"value": "123"}, attempt = 1, result = True
78+
79+
check_str(value=1)
80+
# run "check_str" with keyword kwargs = {"value": 1}, attempt = 1, result = False
81+
82+
check_str(value=None)
83+
# run "check_str" with keyword kwargs = {"value": None}, attempt = 1, exception = ValueError
84+
# run "check_str" with keyword kwargs = {"value": None}, attempt = 2, exception = ValueError
85+
# run "check_str" with keyword kwargs = {"value": None}, attempt = 3, exception = ValueError
86+
87+
88+
@retry_deco(2, [ValueError])
89+
def check_int(value=None):
90+
if value is None:
91+
raise ValueError()
92+
93+
return isinstance(value, int)
94+
95+
check_int(value=1)
96+
# run "check_int" with keyword kwargs = {"value": 1}, attempt = 1, result = True
97+
98+
check_int(value=None)
99+
# run "check_int" with keyword kwargs = {"value": None}, attempt = 1, exception = ValueError # нет перезапуска
100+
101+
```
102+
103+
### 3. Тесты в отдельном модуле для каждого пункта
104+
105+
### 4. Зеленый пайплайн в репе
106+
Обязательно: тесты, покрытие, flake8, pylint.
107+
Опционально можно добавить другие инструменты, например, mypy и black.
108+
Покрытие тестов должно составлять не менее 90%.

lesson-02/lesson-02.pdf

673 KB
Binary file not shown.

0 commit comments

Comments
 (0)