ru
Feedback
Pythoner

Pythoner

Открыть в Telegram

Полезные материалы по Python, которые будут интересны опытному и начинающему разработчику. Сотрудничество - @flattys Цены - @serpent_media Канал на бирже: https://telega.in/c/pythonercode

Больше
6 621
Подписчики
+124 часа
-27 дней
-3130 день
Архив постов
✈️Сегодня поговорим о том, как создавать крутые CLI-приложения с помощью Click. Если вам надоело писать бесконечные if'ы для
✈️Сегодня поговорим о том, как создавать крутые CLI-приложения с помощью Click. Если вам надоело писать бесконечные if'ы для обработки аргументов командной строки, то этот пост определенно для вас! ➡️Начнем с того, почему вообще стоит использовать Click, а не встроенный argparse: —Декораторный подход, который выглядит элегантно и интуитивно понятен —Автоматическая генерация справки и сообщений об ошибках —Вложенные команды из коробки —Поддержка автодополнения в shell ➡️Давайте посмотрим на простой, но реальный пример. Представим, что мы делаем утилиту для работы с файлами:
import click

@click.group()
def cli():
    """Утилита для работы с файлами"""
    pass

@cli.command()
@click.argument('path')
@click.option('--lines', '-l', is_flag=True, help='Показать количество строк')
def analyze(path, lines):
    """Анализирует файл и выводит статистику"""
    try:
        with open(path) as f:
            content = f.readlines()
            if lines:
                click.echo(f'Количество строк: {len(content)}')
    except FileNotFoundError:
        click.secho('Файл не найден! 😱', fg='red')

if __name__ == '__main__':
    cli()
Крутая штука в Click – это то, как легко добавлять новые команды. Хотите добавить подкоманду? Просто навешиваете еще один декоратор! ➡️А теперь лайфхак, который многие упускают: Click умеет создавать красивые прогресс-бары:
@cli.command()
@click.argument('path')
def process(path):
    """Обрабатывает файлы с прогресс-баром"""
    files = os.listdir(path)
    with click.progressbar(files, label='Обработка файлов') as bar:
        for f in bar:
            # что-то делаем с файлом
            time.sleep(0.1)
➡️Про что еще стоит знать? Click отлично работает с цветным выводом. Хотите привлечь внимание пользователя? Используйте click.secho():
click.secho('Внимание! 🚨', fg='yellow', bold=True)
click.secho('Ошибка! ❌', fg='red')
click.secho('Успех! ✅', fg='green')
➡️И напоследок, трюк – создание интерактивных подтверждений:
if click.confirm('Уверены, что хотите удалить все файлы? 🤔'):
    click.echo('Поехали! 🚀')
📂Документация 🐍 Pythoner

✈️ В Python модуль `concurrent.futures` предоставляет высокоуровневый интерфейс для асинхронного выполнения вызовов функций,
✈️ В Python модуль `concurrent.futures` предоставляет высокоуровневый интерфейс для асинхронного выполнения вызовов функций, используя пул потоков или процессов. Он упрощает распараллеливание задач и позволяет эффективно использовать многоядерные процессоры для ускорения выполнения программ. ➡️ Применение concurrent.futures особенно полезно при работе с I/O-bound задачами, такими как сетевые запросы, чтение/запись файлов, взаимодействие с базами данных. Он также может быть эффективен для CPU-bound задач, если они могут быть разделены на независимые подзадачи. ➡️ Вот пример использования concurrent.futures с ThreadPoolExecutor:
import concurrent.futures
import time
import requests

URLS = [
    "https://www.example.com",
    "https://www.google.com",
    "https://www.python.org",
    "https://www.wikipedia.org",
]

def load_url(url, timeout):
    try:
        response = requests.get(url, timeout=timeout)
        return f"{url}: {len(response.content)} bytes"
    except requests.exceptions.RequestException as e:
        return f"{url}: Error: {e}"


start_time = time.time()

# Последовательное выполнение:
for url in URLS:
    print(load_url(url, timeout=60))


end_time = time.time()
print(f"Последовательное выполнение заняло: {end_time - start_time} секунд")





start_time = time.time()

# Асинхронное выполнение с ThreadPoolExecutor:
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
    # map() возвращает результаты в порядке URLS
    future_to_url = {executor.submit(load_url, url, 60): url for url in URLS}
    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]
        try:
            data = future.result()
        except Exception as exc:
            print(f"{url}: generated an exception: {exc}")
        else:
            print(data)

end_time = time.time()
print(f"Асинхронное выполнение заняло: {end_time - start_time} секунд")



⬆️ В этом примере демонстрируется загрузка содержимого нескольких URL-адресов сначала последовательно, а затем асинхронно с использованием ThreadPoolExecutor. Функция load_url загружает данные по указанному URL. ThreadPoolExecutor создает пул потоков, которые выполняют загрузку URL-адресов параллельно. as_completed позволяет обрабатывать результаты по мере их готовности, не дожидаясь завершения всех задач. Сравнение времени выполнения показывает преимущество асинхронного подхода, особенно при работе с сетевыми запросами. 🐍 Pythoner

Подпишитесь на наш Telegram-канал! В Telegram-канале VK Рекламы мы делимся: - успешными кейсами таргетологов и предпринимател
Подпишитесь на наш Telegram-канал! В Telegram-канале VK Рекламы мы делимся: - успешными кейсами таргетологов и предпринимателей; - пошаговыми инструкциями по настройке кампаний; - бесплатными обучающими курсами и вебинарами; - рекламными форматами и инструментами, которые помогут повысить эффективность кампаний. 📅 А ещё анонсируем бесплатные марафоны и офлайн-конференции для разных сфер бизнеса! Подписывайтесь! У нас тут много обучающего контента, который научит любого грамотно пользоваться кабинетом VK Рекламы и настраивать эффективные рекламные кампании. Подписаться #реклама 16+ О рекламодателе

✈️ В Python модуль `difflib` — это мощный инструмент для сравнения последовательностей, таких как строки, списки и другие ите
✈️ В Python модуль `difflib` — это мощный инструмент для сравнения последовательностей, таких как строки, списки и другие итерируемые объекты. Он предоставляет классы и функции для вычисления различий между последовательностями, что позволяет эффективно находить и отображать изменения, например, в текстовых файлах или других данных. ➡️ Применение difflib разнообразно: от сравнения версий файлов и поиска плагиата до создания патчей и слияния изменений в системах контроля версий. Он также может быть полезен для анализа текстовых данных, например, для выявления изменений в документах или сравнения ответов пользователей. ➡️ Вот пример использования difflib для сравнения двух строк:
import difflib

text1 = """
This is the first line.
This is the second line.
This is the third line.
"""

text2 = """
This is the first line.
This is the modified second line.
This is the fourth line.
"""

diff = difflib.ndiff(text1.splitlines(), text2.splitlines())


print("\n".join(diff))

# Вывод:
#   This is the first line.
# - This is the second line.
# + This is the modified second line.
# ?            +++++++++
# 
# - This is the third line.
# ?               ---
# 
# + This is the fourth line.
# ?             ++++
#           ^



# Более наглядное сравнение:

diff = difflib.unified_diff(text1.splitlines(), text2.splitlines(), fromfile='file1.txt', tofile='file2.txt')
print("\n".join(diff))



# Вывод:
# --- file1.txt
# +++ file2.txt
# @@ -1,4 +1,4 @@
# 
#  This is the first line.
# -This is the second line.
# +This is the modified second line.
# -This is the third line.
# +This is the fourth line.



#  Сравнение HTML:
from difflib import HtmlDiff

html_diff = HtmlDiff()
table = html_diff.make_table(text1.splitlines(), text2.splitlines(), fromdesc='file1.txt', todesc='file2.txt')

with open('diff.html', 'w') as f:
    f.write(table) #  Сохранение результата в HTML файл
⬆️ В этом примере демонстрируется использование функций ndiff и unified_diff для сравнения двух строк построчно. ndiff показывает различия с помощью специальных символов: - для удаленных строк, + для добавленных и ? для изменений внутри строки. unified_diff предоставляет более компактный вывод, похожий на формат патчей. Также показан пример использования HtmlDiff для создания HTML-таблицы с различиями, что удобно для визуального сравнения. 🐍 Pythoner

Миграция в облако? Это легко! Собственная инфраструктура устарела или не справляется с нагрузками? Используйте облачные ресур
Миграция в облако? Это легко! Собственная инфраструктура устарела или не справляется с нагрузками? Используйте облачные ресурсы! Эксперты Yandex Cloud помогут перейти в облако быстро, легко и безопасно. ✅ Мы полностью сопровождаем процесс. ✅ От вас — только инженер с доступом к инфраструктуре. ✅ Архитектура под ваши задачи, миграция и поддержка на каждом шагу — всё включено. ⚡Переходите в Yandex Cloud и забудьте о старом железе. А если успеете подать заявку до 31 декабря, мы покроем расходы на инженеров и тестовую инфраструктуру. Подать заявку #реклама 16+ yandex.cloud О рекламодателе Реклама на Яндексе

✈️ В Python FastAPI — это современный, высокопроизводительный веб-фреймворк для создания API. Он основан на стандартах OpenAP
✈️ В Python FastAPI — это современный, высокопроизводительный веб-фреймворк для создания API. Он основан на стандартах OpenAPI и JSON Schema, что обеспечивает автоматическую генерацию интерактивной документации и валидацию данных. FastAPI использует асинхронный подход (ASGI), что делает его одним из самых быстрых Python фреймворков. ➡️ Применение FastAPI идеально подходит для разработки API, микросервисов, backend-систем и других веб-приложений, где требуется высокая производительность, простота разработки и надежная валидация данных. Автоматическая генерация документации существенно упрощает взаимодействие с API. ➡️ Вот пример простого приложения FastAPI:
from fastapi import FastAPI, Query, Path, HTTPException
from pydantic import BaseModel
from typing import List, Optional

app = FastAPI(title="My Awesome API", version="1.0.0", description="Example FastAPI application")


class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None


@app.get("/")  # GET-запрос на корневой путь
async def root():
    return {"message": "Hello World"}


@app.get("/items/{item_id}")  # GET-запрос с параметром пути
async def read_item(item_id: int = Path(..., title="The ID of the item to get", ge=1)): # Валидация параметра пути
    return {"item_id": item_id}


@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, min_length=3, max_length=50)): # Валидация query-параметра
    results = {"items": [{"item_id": "foo"}, {"item_id": "bar"}]}
    if q:
        results.update({"q": q})
    return results



@app.post("/items/", response_model=Item)  # POST-запрос с валидацией тела запроса
async def create_item(item: Item):
    return item


@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
    return {"item_id": item_id, **item.dict()}


@app.get("/users/{user_id}")
async def get_user(user_id: int):
    # Пример обработки ошибок
    if user_id == 404:
        raise HTTPException(status_code=404, detail="User not found")
    return {"user_id": user_id}
# Запуск приложения
uvicorn main:app --reload
⬆️ В этом примере демонстрируется создание приложения FastAPI, определение GET и POST маршрутов, использование параметров пути и запроса с валидацией, работа с Pydantic моделями для валидации тела запроса и обработка ошибок с помощью HTTPException. Для запуска приложения используйте команду uvicorn main:app --reload, где main — имя файла, а app — имя экземпляра FastAPI. После запуска перейдите по адресу /docs в браузере, чтобы увидеть автоматически сгенерированную интерактивную документацию. 🐍 Pythoner

✈️ В Python dataclasses — это модуль, предоставляющий декоратор @dataclass, который автоматически генерирует шаблонный код дл
✈️ В Python dataclasses — это модуль, предоставляющий декоратор @dataclass, который автоматически генерирует шаблонный код для классов, преимущественно предназначенных для хранения данных. Это упрощает создание классов с атрибутами, методами __init__, __repr__, __eq__ и другими, без необходимости писать их вручную. ➡️ Применение dataclasses позволяет сократить объем кода, улучшить его читаемость и уменьшить вероятность ошибок, связанных с ручным написанием шаблонного кода. Они особенно полезны для создания классов, представляющих структуры данных или объекты с простым набором атрибутов. ➡️ Вот пример использования dataclasses:
from dataclasses import dataclass, field

@dataclass(order=True)  # order=True добавляет методы сравнения
class Person:
    name: str
    age: int
    city: str = "Unknown"  # Значение по умолчанию
    email: str = field(default="no_email@example.com", repr=False) # repr=False скрывает поле в __repr__
    scores: list[int] = field(default_factory=list)  # mutable default value


person1 = Person("Alice", 30, "New York", scores=[100, 90])
person2 = Person("Bob", 25, "Los Angeles")
person3 = Person("Charlie", 35, scores=[80, 85])
person4 = Person("Alice", 30, "New York", scores=[100, 90])


print(person1)  # Вывод: Person(name='Alice', age=30, city='New York', scores=[100, 90])
print(person2)  # Вывод: Person(name='Bob', age=25, city='Los Angeles', scores=[])
print(person3) # Вывод: Person(name='Charlie', age=35, city='Unknown', scores=[80, 85])

print(person1 == person4) # True
print(person1 > person2) # True  (сравнение по name, затем age)


# Изменение атрибутов:
person1.city = "San Francisco"
person1.scores.append(95)

print(person1)  # Вывод: Person(name='Alice', age=30, city='San Francisco', scores=[100, 90, 95])

# Post-init processing
@dataclass
class InventoryItem:
    """Class for keeping track of an item in inventory."""
    name: str
    unit_price: float
    quantity_on_hand: int = 0

    def __post_init__(self):
        self.total_cost = self.unit_price * self.quantity_on_hand



item = InventoryItem("Pen", 1.5, 50)
print(item.total_cost) # 75.0
⬆️ В этом примере показано создание dataclass Person с различными типами полей, включая значение по умолчанию, field для скрытия поля в __repr__ и default_factory для изменяемых значений по умолчанию. Демонстрируется вывод информации о dataclass с помощью print, сравнение объектов dataclass и изменение атрибутов. Также приведен пример использования __post_init__ для выполнения действий после инициализации dataclass, как, например, вычисление total_cost в InventoryItem. order=True позволяет сравнивать экземпляры dataclass. 🐍Pythoner

✈️ В Python си-коллбеки (C callbacks) — это механизм, позволяющий вызывать функции, написанные на языке C или C++, из Python
✈️ В Python си-коллбеки (C callbacks) — это механизм, позволяющий вызывать функции, написанные на языке C или C++, из Python кода. Это мощный инструмент для интеграции Python с существующими библиотеками C/C++ или для оптимизации производительности критически важных участков кода. ➡️ Применение си-коллбеков находит применение в различных областях, таких как: * Интеграция с C/C++ библиотеками: вызов функций из библиотек, написанных на C/C++, непосредственно из Python. * Оптимизация производительности: реализация критичных к производительности участков кода на C/C++ и вызов их из Python. * Обработка событий: использование функций Python в качестве обработчиков событий в C/C++ приложениях. * Расширение функциональности Python: добавление новых возможностей в Python с помощью C/C++. ➡️ Вот пример использования си-коллбеков с ctypes:
import ctypes
import time

# Загрузка библиотеки C (libcallback_example.so - пример,  нужно скомпилировать код C)
lib = ctypes.CDLL("./libcallback_example.so")

# Определение типа функции обратного вызова
CMPFUNC = ctypes.CFUNCTYPE(None, ctypes.c_int)


# Функция Python, которая будет использоваться в качестве обратного вызова
def my_callback(value):
    print(f"Python callback called with value: {value}")



# Регистрация функции обратного вызова в библиотеке C
#  Предполагается, что в библиотеке C есть функция register_callback, принимающая указатель на функцию
register_callback = lib.register_callback
register_callback.argtypes = [CMPFUNC]
register_callback.restype = None
register_callback(CMPFUNC(my_callback))


# Вызов функции C, которая будет периодически вызывать функцию обратного вызова
# Предполагается, что в библиотеке C есть функция run_loop, которая запускает цикл
run_loop = lib.run_loop
run_loop.argtypes = []
run_loop.restype = None
run_loop()

Пример кода на C (callback_example.c):
#include <stdio.h>
#include <unistd.h> // for sleep


typedef void (*callback_function)(int);

static callback_function registered_callback = NULL;

void register_callback(callback_function callback) {
    registered_callback = callback;
}

void run_loop() {
    int i = 0;
    while (i < 5) {
        sleep(1);
        if (registered_callback != NULL) {
            registered_callback(i);
        }
        i++;
    }
}
Компиляция кода на C:
gcc -shared -o libcallback_example.so -fPIC callback_example.c
⬆️ В этом примере показано, как использовать ctypes для вызова функций из динамически подключаемой библиотеки C и передачи функции Python в качестве обратного вызова. Код на C регистрирует коллбек и периодически вызывает его. Важно правильно определить типы данных с помощью ctypes.CFUNCTYPE и argtypes/restype. Перед запуском Python кода необходимо скомпилировать код C в shared library (.so файл для Linux). 🐍 Pythoner

✈️ В Python BeautifulSoup4 (bs4) — это мощная библиотека для парсинга HTML и XML документов. Она предоставляет удобный интерф
✈️ В Python BeautifulSoup4 (bs4) — это мощная библиотека для парсинга HTML и XML документов. Она предоставляет удобный интерфейс для навигации, поиска и модификации элементов в древовидной структуре документа. BeautifulSoup4 автоматически обрабатывает некорректный HTML, что делает её незаменимой для работы с реальными веб-страницами. ➡️ Применение BeautifulSoup4 широко распространено в веб-скрапинге, извлечении данных, анализе веб-контента и автоматизации задач, связанных с обработкой HTML и XML. Библиотека позволяет легко извлекать текст, ссылки, атрибуты и другие данные из веб-страниц. ➡️ Вот пример использования BeautifulSoup4 для парсинга HTML:
from bs4 import BeautifulSoup

html_content = """
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Example Page</title>
    <meta name="description" content="Example description">
</head>
<body>
    <h1>This is a heading</h1>
    <p>This is some text in a paragraph.</p>
    <a href="https://www.example.com">This is a link</a>
    <ul>
        <li>Item 1</li>
        <li>Item 2</li>
    </ul>
    <div class="my-class">This is a div</div>

    <p id="my-id">This is a paragraph with id </p>
</body>
</html>
"""

soup = BeautifulSoup(html_content, "html.parser")  # "html.parser" - используемый парсер


# Навигация и поиск элементов:
title = soup.title.string  # Получение текста заголовка
print("Title:", title)

description = soup.find("meta", attrs={"name": "description"})["content"]
print("Description:", description)


links = soup.find_all("a")
for link in links:
    print("Link:", link["href"])

paragraphs = soup.find_all("p")
for p in paragraphs:
    print("Paragraph:", p.text)

list_items = soup.find("ul").find_all("li")
for item in list_items:
    print("List item:", item.text)

div_with_class = soup.find("div", class_="my-class")
print("Div with class:", div_with_class.text)

paragraph_with_id = soup.find("p", id="my-id")
print("Paragraph with id:", paragraph_with_id.text)



# Модификация HTML:

new_paragraph = soup.new_tag("p")
new_paragraph.string = "This is a new paragraph."
soup.body.append(new_paragraph)

print(soup.prettify()) #  Вывод измененного HTML с отступами
⬆️ В этом примере демонстрируется создание объекта BeautifulSoup из HTML-строки, получение заголовка, поиск элементов по тегам, атрибутам и классам, извлечение текста и атрибутов элементов, а также добавление нового элемента в HTML-структуру. Используется парсер "html.parser", который встроен в Python. Для более сложных случаев можно использовать другие парсеры, такие как lxml или html5lib. Вывод soup.prettify() позволяет увидеть форматированный HTML-код после внесенных изменений. 🐍 Pythoner

🐍Разбор Что возвращает метод строки find()? Самый быстрый способ это узнать — заглянуть в документацию Python. Согласно официальной документации, если подстрока не найдена, метод `find()` возвращает -1. Теперь интересный момент: что произойдет, если преобразовать `-1` в логическое значение? Давайте проверим:
print(bool(-1))  # Результат: True
Как видите, -1 в Python считается истинным значением (True) при приведении к типу bool.

Что выдаст код выше❔
Anonymous voting

photo content

✈️ В Python Black — это мощный инструмент форматирования кода, известный своей бескомпромиссностью и скоростью. Black автомат
✈️ В Python Black — это мощный инструмент форматирования кода, известный своей бескомпромиссностью и скоростью. Black автоматически переформатирует ваш код Python в соответствии со строгим набором правил, устраняя споры о стиле кода и обеспечивая единообразное форматирование во всей кодовой базе. ➡️ Применение Black значительно упрощает командную работу над проектами, поскольку разработчикам больше не нужно тратить время на ручное форматирование кода и обсуждение стилистических предпочтений. Black также улучшает читаемость кода, делая его более понятным и удобным для восприятия. Автоматическое форматирование экономит время и позволяет сосредоточиться на логике кода, а не на его внешнем виде. ➡️ Вот пример использования Black:
# неформатированный код
def very_important_function(template: str, *variables, engine: str = "jinja2"):
    """Applies `variables` to the `template` using the `engine`."""
    if engine == "jinja2":
        return template.render(*variables)
    elif engine == 'f-strings':
        return eval(f"f'{template}'")
    return template.format(*variables)

# установка black: pip install black
# запуск black: black имя_файла.py

# отформатированный код после Black
def very_important_function(
    template: str, *variables, engine: str = "jinja2"
):
    """Applies `variables` to the `template` using the `engine`."""
    if engine == "jinja2":
        return template.render(*variables)
    elif engine == "f-strings":
        return eval(f"f'{template}'")
    return template.format(*variables)
⬆️В этом примере показан фрагмент кода до и после форматирования Black. Black автоматически изменил отступы, переводы строк и расположение скобок, приведя код к единому стилю. Обратите внимание, что Black не изменяет логику кода, а только его форматирование. Для использования Black необходимо установить его с помощью pip install black и запустить из командной строки, указав имя файла или директории, которую нужно отформатировать: black имя_файла.py или black . для форматирования всех файлов в текущей директории. 🐍 Pythoner

Школьник + бесплатные курсы по ИТ = новые возможности Хотите прокачать мышление, научиться решать задачи по математике и инфо
Школьник + бесплатные курсы по ИТ = новые возможности Хотите прокачать мышление, научиться решать задачи по математике и информатике и познакомиться с ИТ? Бесплатные курсы для школьников в этом помогут. Занятия включают теорию и практические задачи, а само обучение не будет отнимать много времени - нужно 2-3 часа в неделю. После успешного прохождения одного из курсов вам выдадут сертификат - им можно пополнить портфолио. Чтобы начать учиться, выберите подходящую программу и оставьте заявку на сайте Т-Образования. Подать заявку #реклама 16+ education.tbank.ru О рекламодателе

✈️ В Python asyncpg — это высокопроизводительная библиотека для асинхронного доступа к базам данных PostgreSQL. Она построена
✈️ В Python asyncpg — это высокопроизводительная библиотека для асинхронного доступа к базам данных PostgreSQL. Она построена на базе asyncio и предоставляет низкоуровневый интерфейс для взаимодействия с PostgreSQL, обеспечивая высокую скорость и эффективность. ➡️ Применение asyncpg особенно актуально в высоконагруженных веб-приложениях и сервисах, где требуется максимальная производительность при работе с базой данных. asyncpg позволяет выполнять запросы к базе данных асинхронно, не блокируя основной поток приложения, что повышает общую отзывчивость и пропускную способность. Библиотека также поддерживает продвинутые возможности PostgreSQL, такие как JSON, hstore и уведомления. ➡️ Вот пример использования asyncpg для выполнения запросов к базе данных:
import asyncio
import asyncpg


async def run():
    conn = await asyncpg.connect(user="user", password="password", database="database", host="127.0.0.1") # Подставьте свои учетные данные

    try:
        # Выполнение запроса на создание таблицы (если она не существует)
        await conn.execute('''
            CREATE TABLE IF NOT EXISTS users (
                id SERIAL PRIMARY KEY,
                name TEXT
            )
        ''')

        # Выполнение запроса на вставку данных
        await conn.execute("INSERT INTO users (name) VALUES ($1)", "Alice")

        # Выполнение запроса на выборку данных
        result = await conn.fetch("SELECT * FROM users")
        print(result) # Вывод: [<Record id=1 name='Alice'>]

        # Выполнение параметризованного запроса на выборку данных
        user_name = "Alice"
        user = await conn.fetchrow("SELECT * FROM users WHERE name = $1", user_name)
        print(user) # Вывод: <Record id=1 name='Alice'>

        # Транзакции
        async with conn.transaction():
            await conn.execute("UPDATE users SET name = $1 WHERE id = $2", "Bob", 1)


        # Обработка ошибок
        try:
            await conn.execute("SELECT * FROM non_existent_table")  # Несуществующая таблица
        except asyncpg.exceptions.UndefinedTableError as e:
            print(f"Ошибка: {e}")



    finally:
        await conn.close()


if __name__ == "__main__":
    asyncio.run(run())
⬆️ В этом примере демонстрируется подключение к базе данных PostgreSQL, выполнение различных SQL-запросов (создание таблицы, вставка, выборка данных), использование параметризованных запросов, обработка транзакций и пример обработки исключения UndefinedTableError. Для запуска примера необходимо установить asyncpg (pip install asyncpg) и иметь работающий сервер PostgreSQL с указанными учетными данными. Не забудьте заменить user, password, database, и host на ваши реальные данные. Помните, что asyncpg работает асинхронно, поэтому необходимо использовать asyncio.run() для запуска кода. 🐍 Pythoner

Крупнейший университет искусственного интеллекта Учим использовать ChatGPT в профессиональных целях, создавать нейро-сотрудни
Крупнейший университет искусственного интеллекта Учим использовать ChatGPT в профессиональных целях, создавать нейро-сотрудников и зарабатывать на искусственном интеллекте. ✨ 8 000+ студентов со всего мира ✨ 600+ AI-проектов, созданных студентами ✨ Сборная Университета — победители крупнейших AI-хакатонов России ✨ Стажировки в крупнейших компаниях России (РЖД, Ростелеком, РУДН, Совкомбанк, Самолет и другие) ✨ Трудоустраиваем выпускников в крупнейшие компании (Яндекс, ВТБ, Сбербанк, Роскосмос и другие) Будем рады видеть тебя в наших рядах! Узнать больше #реклама 16+ neural-university.ru О рекламодателе

✈️ В Python trafilatura — это мощная библиотека для извлечения основного текста из веб-страниц. Она эффективно обрабатывает H
✈️ В Python trafilatura — это мощная библиотека для извлечения основного текста из веб-страниц. Она эффективно обрабатывает HTML, XML и другие форматы, удаляя ненужные элементы, такие как навигация, реклама и боковые панели, оставляя только основной контент статьи или публикации. ➡️ Применение trafilatura широко распространено в веб-скрапинге, анализе текста, создании датасетов для машинного обучения и других задачах, где требуется чистый текст из веб-источников. Библиотека предоставляет гибкие настройки для обработки различных типов веб-страниц и поддерживает извлечение метаданных, таких как заголовок, автор и дата публикации. ➡️ Вот пример использования trafilatura для извлечения текста из веб-страницы:
from trafilatura import extract

downloaded_html = """
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Example Page</title>
</head>
<body>
    <h1>This is a heading</h1>
    <p>This is some text in a paragraph.</p>
    <aside>This is some text in a sidebar.</aside>
    <p>This is more text in another paragraph.</p>
    <footer>This is a footer.</footer>
</body>
</html>
"""

extracted_text = extract(downloaded_html)

print(extracted_text)

# Вывод:
# This is a heading
# This is some text in a paragraph.
# This is more text in another paragraph.

from trafilatura import fetch_url

url = "https://www.example.com" #  Замените на реальный URL

try:
    extracted_text = fetch_url(url)
    if extracted_text:
        print(extracted_text)
    else:
        print("Не удалось извлечь текст с URL")
except Exception as e:
    print(f"Произошла ошибка: {e}")


from trafilatura import bare_extraction

extracted_text_with_metadata = bare_extraction(downloaded_html, include_comments=False, include_tables=True, deduplicate=True)
print(extracted_text_with_metadata)

# Пример вывода (может варьироваться в зависимости от контента страницы):
# {'title': 'Example Page', 'text': 'This is a heading\nThis is some text in a paragraph.\nThis is more text in another paragraph.', 'author': None, 'url': None, 'hostname': None, 'description': None, 'date': None}

⬆️ В этом примере демонстрируется использование функций extract и fetch_url из библиотеки trafilatura. Функция extract извлекает текст из предоставленного HTML-кода, а fetch_url загружает и обрабатывает веб-страницу по указанному URL. Также приведен пример использования bare_extraction для получения текста вместе с метаданными. Обратите внимание, что для работы с fetch_url требуется активное интернет-соединение и корректный URL. Пример с bare_extraction показывает, как получить дополнительные данные, такие как заголовок страницы. 🐍 Pythoner

✈️ В Python абстрактные классы (ABC) — это классы, которые предназначены для того, чтобы быть базовыми для других классов, и
✈️ В Python абстрактные классы (ABC) — это классы, которые предназначены для того, чтобы быть базовыми для других классов, и не предполагают создания собственных экземпляров. Абстрактные классы позволяют определить общий интерфейс для группы подклассов, обеспечивая, что все они реализуют определенные методы. ➡️ Применение абстрактных классов способствует созданию более структурированного и поддерживаемого кода, повышает его читаемость и позволяет применять полиморфизм более эффективно. Они особенно полезны при разработке библиотек и фреймворков, где необходимо обеспечить определенный набор функциональности в классах-наследниках. Использование ABC помогает предотвратить ошибки, связанные с отсутствием реализации обязательных методов в подклассах, которые могли бы проявиться только во время выполнения. ➡️ Вот пример абстрактного класса и его использования:
from abc import ABC, abstractmethod

class Animal(ABC):  # Animal - абстрактный базовый класс

    @abstractmethod
    def make_sound(self):
        pass

    @abstractmethod
    def move(self):
        pass


class Dog(Animal):
    def make_sound(self):
        return "Woof!"

    def move(self):
        return "Runs"


class Cat(Animal):
    def make_sound(self):
        return "Meow!"

    def move(self):
        return "Walks"


dog = Dog()
print(dog.make_sound())  # Вывод: Woof!
print(dog.move()) # Вывод: Runs

cat = Cat()
print(cat.make_sound()) # Вывод: Meow!
print(cat.move()) # Вывод: Walks



try:
    animal = Animal() # Попытка создать экземпляр абстрактного класса
except TypeError as e:
    print(e) # Вывод: Can't instantiate abstract class Animal with abstract methods make_sound, move


animals = [Dog(), Cat()]
for animal in animals:
    print(animal.make_sound()) #  Полиморфизм: вызов метода make_sound для разных животных


class Fish(Animal):
    def make_sound(self):
        return "Blub!"


    # Забыли реализовать метод move


try:
    fish = Fish() #  Попытка создать экземпляр класса с нереализованным абстрактным методом
except TypeError as e:
    print(e) # Вывод: Can't instantiate abstract class Fish with abstract methods move
⬆️ В этом примере создается абстрактный класс Animal с абстрактными методами make_sound и move. Классы Dog и Cat наследуют от Animal и реализуют эти методы. Попытка создать экземпляр самого абстрактного класса Animal приводит к ошибке TypeError. Демонстрируется полиморфизм: один и тот же код animal.make_sound() работает с объектами разных классов, производных от Animal, и выдает специфичный для каждого класса результат. Также показан пример ошибки, возникающей при попытке создания экземпляра класса Fish, который не реализует все абстрактные методы базового класса. 🐍 Pythoner

Хочешь узнать все самые интересные фишки в DevOps? Подписывайся на Telegram-канал DevOps Bootcamp от учебного центра Слёрм и
Хочешь узнать все самые интересные фишки в DevOps? Подписывайся на Telegram-канал DevOps Bootcamp от учебного центра Слёрм и забирай подарок! Для тех, кто собирается в DevOps ы разработали свой Roadmap на основе опыта спикеров Слёрма. Он сделан с учётом российских реалий, разбит на уровни, фокусирует внимание на том, что в первую очередь понвдобится для старта и роста в профессии, и содержит ссылки на дополнительные источники. Подписаться #реклама 16+ slurm.io О рекламодателе

✈️ В Python httpx — это современная HTTP-клиентская библиотека, которая предоставляет полный набор функций для работы с HTTP/
✈️ В Python httpx — это современная HTTP-клиентская библиотека, которая предоставляет полный набор функций для работы с HTTP/1.1 и HTTP/2. httpx позволяют разработчикам легко и эффективно взаимодействовать с веб-серверами, отправляя запросы и получая ответы. ➡️ Применение httpx. httpx широко используется в различных сценариях, включая: - Веб-скрейпинг: Извлечение данных с веб-страниц. - API-интеграции: Взаимодействие с RESTful API. - Тестирование: Автоматизация тестирования веб-сервисов. - Микросервисы: Обмен данными между микросервисами. ➡️ Вот пример использования httpx:
import httpx

# Отправка GET-запроса
response = httpx.get("https://api.github.com")

# Проверка статуса ответа
if response.status_code == 200:
    print("Успешный запрос!")
    print("Содержимое ответа:", response.text)
else:
    print("Ошибка:", response.status_code)

# Отправка POST-запроса
data = {"key1": "value1", "key2": "value2"}
response = httpx.post("https://httpbin.org/post", data=data)

# Проверка статуса ответа
if response.status_code == 200:
    print("Успешный POST-запрос!")
    print("Содержимое ответа:", response.json())
else:
    print("Ошибка:", response.status_code)
⬆️ В этом примере создается HTTP-клиент с использованием httpx, который отправляет GET и POST запросы на указанные URL. 🐍 Pythoner