PytStart | Программирование на Python
4.45K subscribers
20 photos
26 videos
54 links
Python: примеры кода, уроки, статьи

Купить рекламу: https://telega.in/c/pytstart

✍️По всем вопросам: @Pascal4eg
Download Telegram
🐍 Clite ультра‑лёгкий zero‑dependency фреймворк для CLI на Python

Хочешь писать свои CLI‑утилиты без кучи зависимостей? Новый проект Clite от искусного автора на Хабре — как раз то, что нужно. Это minimal‑вес без Typer, Click и прочего — всего \~300 строк кода, и при этом поддержка type hints и декораторов знакомых из FastAPI/Flask!

🚀 В статье ты узнаешь:

📌 Почему автор выбрал минимализм и вместо Click/Typer реализовал свой парсер аргументов
📌 Как реализована поддержка @app.command() и аннотации для аргументов
📌 Почему зависимостей почти нет (только typing-extensions)
📌 Взгляд в roadmap — sub‑commands, Annotated, свой echo и др.
📌 Как сделать свой CLI‑инструмент небольшим, понятным и удобным

➡️ Читайте и наслаждайтесь

🗣️ Если тебе близок minimalist‑стиль, хочешь учиться у автора и писать свои инструменты — Clite просто must‑read!

🤩 Pytstart ||#Статья #Python #CLI #ZeroDeps
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
🖥 Python-фишка: Игнорируем ошибки элегантно

Вам наверняка приходилось писать код, где ошибку нужно просто проигнорировать.
Например, удалить файл, если он есть (а если нет — ну и ладно).

Обычно это выглядит так:

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
👍53👎2
🖥 Ускорение кода в 100 раз одной строкой

Если у вас есть функция, которая выполняет тяжелые вычисления (или рекурсию) с одними и теми же аргументами, вы можете мгновенно её ускорить.

Импортируем декоратор `@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 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
👍83
🤐 Склеиваем списки с помощью `zip()`

Частая задача: есть два связанных списка (например, имена и зарплаты), и нужно пройтись по ним одновременно.

⛔️ Плохой способ (через индекс):

names = ['Anna', 'Oleg']
salaries = [100, 200]

for i in range(len(names)):
print(names[i], salaries[i])


🖥 Pythonic способ:
Функция 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
👍42
🖥 Безопасные словари (`dict.get`)

Базовый, но супер-важный навык написания надежного кода.

🦺 Хватит ловить `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