|
15 | 15 | - [Файлы `__init__.py`](#файлы-__init__py) |
16 | 16 | - [Докстринги](#докстринги) |
17 | 17 | - [Документация к REST API](#документация-к-rest-api) |
| 18 | +- [Про код](#про-код) |
18 | 19 | - [Про Pull Request](#про-pull-request) |
19 | 20 | - [Размер Pull Request](#размер-pull-request) |
20 | 21 |
|
@@ -187,6 +188,54 @@ from some.absolute.path import foo, bar |
187 | 188 | **Почему?** Потому что это один из распространенных форматов для документирования REST API, которая вышла из Swagger. Данный формат документации поддерживается большим количеством клиентов (Swagger, Postman, Insomnia Designer и многие другие). Также, рукописная документация имеет свойство быстро устаревать, а документация, которая генерируется напрямую из кода позволяет не думать о постоянном обновлении документации. |
188 | 189 |
|
189 | 190 |
|
| 191 | +## Про код |
| 192 | +**1 действие ~ 1 строка** |
| 193 | + |
| 194 | +На каждой строке надо постараться делать ровно одно действие. |
| 195 | + |
| 196 | +Плохо ❌: |
| 197 | +```python |
| 198 | +# 1. 3 действия на одной строке - 3 вызова функции |
| 199 | +foo_result = foo(bar(spam(x))) |
| 200 | +
|
| 201 | +# 2. 3 действия на одной строке - вызов функции foo, get_c, from_b |
| 202 | +foo_result = foo(a=a, b=b, c=get_c(from_b()) |
| 203 | +
|
| 204 | +# 3. 3 действия на одной строке - фильтрация по аргументам, условное получение элементов (через or), вызов метода .value |
| 205 | +result = [(a.value() or A, b or B) for a, b in iterator if a < b] |
| 206 | +
|
| 207 | +# 4. 4 действия на одной строке - из библиотеки / переменной foo идет получение атрибута bar, получение атрибута spam, получение атрибута hello и вызов calculate_weather |
| 208 | +result = calculate_weather(foo.bar.spam.hello) |
| 209 | +``` |
| 210 | + |
| 211 | +Хорошо ✅: |
| 212 | +```python |
| 213 | +# 1. делаем поочередный вызов каждой функции |
| 214 | +spam_result = spam(x) |
| 215 | +bar_result = bar(spam_result) |
| 216 | +foo_result = foo(bar_result) |
| 217 | +
|
| 218 | +# 2. поочередно вызываем функции, результат пишем в переменную и используем ее при вызове foo |
| 219 | +from_b_result = from_b() |
| 220 | +c = get_c(from_b_result) |
| 221 | +foo_result = foo(a=a, b=b, c=c) |
| 222 | +
|
| 223 | +# 3. последовательно проводим действия над списком - вначале фильтруем, вызываем метод .value у a, выбираем между элементами (or) |
| 224 | +filtered_result = ((a, b) for a, b in iterator if a < b) |
| 225 | +intermediate_result = ((a.value(), b) for a, b in filtered_result) |
| 226 | +result = [(a or A, b or B) for a, b in intermediate_result] |
| 227 | +
|
| 228 | +# 4 . последовательно читаем атрибуты bar, spam, hello и вызываем функцию calculate_weather |
| 229 | +bar = foo.bar |
| 230 | +spam = bar.spam |
| 231 | +hello = spam.hello |
| 232 | +result = calculate_weather(hello) |
| 233 | +``` |
| 234 | + |
| 235 | + |
| 236 | +**Почему?** Потому что код становится более читабельным, не нужно исполнять несколько выражений в голове во время чтения кода. Разбитый до простых атомных операций код воспринимается гораздо лучше, чем сложный уан-лайнер. Постарайтесь упростить свой код настолько, насколько это возможно - код чаще читается, чем пишется. |
| 237 | + |
| 238 | + |
190 | 239 | ## Про Pull Request |
191 | 240 | **1 Pull Request = 1 issue** |
192 | 241 |
|
|
0 commit comments