Хочешь писать свои CLI‑утилиты без кучи зависимостей? Новый проект Clite от искусного автора на Хабре — как раз то, что нужно. Это minimal‑вес без Typer, Click и прочего — всего \~300 строк кода, и при этом поддержка type hints и декораторов знакомых из FastAPI/Flask!
@app.command() и аннотации для аргументовPlease open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2
Вам наверняка приходилось писать код, где ошибку нужно просто проигнорировать.
Например, удалить файл, если он есть (а если нет — ну и ладно).
❌ Обычно это выглядит так:
import os
try:
os.remove("temp.txt")
except FileNotFoundError:
pass # Выглядит не очень красиво
✅ Pythonic way:
Используйте контекстный менеджер
suppress из модуля contextlib.
import os
from contextlib import suppress
with suppress(FileNotFoundError):
os.remove("temp.txt")
Это делает намерение программиста очевидным: "Попробуй выполнить, но если вылетит эта ошибка — подави её". Код становится чище и читаемее.
#python #cleancode #refactoring #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3👎2
Если у вас есть функция, которая выполняет тяжелые вычисления (или рекурсию) с одними и теми же аргументами, вы можете мгновенно её ускорить.
Импортируем декоратор `@lru_cache` из модуля
functools.Пример (классический Фибоначчи):
from functools import lru_cache
@lru_cache(maxsize=None) # <--- Вся магия здесь
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
print(fib(50))
Без кэша: Python будет считать это вечность (миллиарды вызовов).
С кэшем: Результат выведется мгновенно.
Декоратор запоминает результаты вызова функции. Если функцию вызовут снова с теми же аргументами, Python не будет считать заново, а просто возьмет готовый ответ из памяти.
#python #performance #optimization #functools
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
Обычные кортежи (`tuple`) экономят память, но обращаться к данным по индексу — неудобно.
point[0] — что это? Координата X? Широта? ID пользователя?Используйте `NamedTuple` из модуля
typing (или `collections`). Это как класс, только легче.
from typing import NamedTuple
class Point(NamedTuple):
x: int
y: int
p = Point(10, 20)
# Теперь можно обращаться по имени!
print(p.x, p.y) # 10 20
# Но поведение кортежа сохраняется
print(p[0]) # 10
Это делает код "самодокументируемым". Идеально для возврата нескольких значений из функции.
#python #typing #structures #tips
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
🤯 Математика с булевыми значениями
А вы знали, что в Python
Поэтому такой код абсолютно валиден:
Или даже так (используем как индекс):
💡 Примечание: в продакшене лучше так не писать, но знать об этом полезно!
#python #funfacts #underTheHood
А вы знали, что в Python
True и False — это на самом деле просто замаскированные 1 и 0? Тип bool наследуется от int.Поэтому такой код абсолютно валиден:
x = True + True + 5
print(x)
# Вывод: 7 (1 + 1 + 5)
Или даже так (используем как индекс):
options = ["Нет", "Да"]
is_agreed = True
print(options[is_agreed])
# Вывод: "Да" (потому что options[1])
#python #funfacts #underTheHood
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3
🤐 Склеиваем списки с помощью `zip()`
Частая задача: есть два связанных списка (например, имена и зарплаты), и нужно пройтись по ним одновременно.
⛔️ Плохой способ (через индекс):
🖥 Pythonic способ:
Функция
💡 Важно:
#python #bestpractices #codingtips
Частая задача: есть два связанных списка (например, имена и зарплаты), и нужно пройтись по ним одновременно.
⛔️ Плохой способ (через индекс):
names = ['Anna', 'Oleg']
salaries = [100, 200]
for i in range(len(names)):
print(names[i], salaries[i])
Функция
zip берет по одному элементу из каждого списка и отдает их парами.
names = ['Anna', 'Oleg', 'Max']
salaries = [100, 200, 300]
for name, salary in zip(names, salaries):
print(f"{name} получает {salary}k")
💡 Важно:
zip остановится, как только закончится самый короткий список. Если нужно сохранить все данные (заполнив пустоты None`), используйте `zip_longest из модуля itertools.#python #bestpractices #codingtips
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2
Базовый, но супер-важный навык написания надежного кода.
🦺 Хватит ловить `KeyError` в словарях!
Представьте, вы получаете JSON от API или читаете конфиг. Вы пытаетесь достать значение по ключу, а его там нет. Программа падает с ошибкой
KeyError.Вместо того чтобы писать проверки
if key in data:, используйте метод `.get()`. Он безопасно вернет
None, если ключа нет. А еще лучше — ему можно передать значение по умолчанию вторым аргументом.
user_config = {"username": "admin", "language": "ru"}
# Опасно:
# theme = user_config["theme"] # ОШИБКА!
# Безопасно:
theme = user_config.get("theme", "dark")
# Если ключа "theme" нет, вернется "dark"
print(theme) # dark
Это правило хорошего тона в Python. Используйте
.get() везде, где не уверены на 100% в структуре словаря! 🛡#python #optimization #cleancode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1