>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
Вы когда-нибудь задумывались, почему при попытке выйти из интерактивного Python с помощью простого
exit или quit появляется это сообщение? Решение довольно неожиданное, но изящное. Это не специальный случай для интерактивной оболочки, она просто показывает представление каждого вычисленного результата, а эта строка - просто представление функции exit.Строго говоря, вы не должны использовать exit в своих повседневных проектах, поскольку она была создана специально для интерактивной оболочки. Вместо этого используйте
sys.exit().👉
Если вы хотите перехватить как
👉
IndexError, так и KeyError, вы можете и должны использовать LookupError, их общего предка. Это оказалось полезным при доступе к сложным вложенным данным.
try:
db_host = config['databases'][0]['hosts'][0]
except LookupError:
db_host = 'localhost'
👉
Python 3 позволяет сделать некоторые аргументы функции обязательными именованными аргументами, что означает, что их нужно передавать как
Это может быть полезно, чтобы предотвратить вызовы функции вроде:
Чтобы достичь этого результата, следует разместить обязательные именованные аргументы после аргумента переменной длины (также известного как
Если вам не нужен
👉
(arg=value), а не просто (value).Это может быть полезно, чтобы предотвратить вызовы функции вроде:
grep(text, pattern, True, False, True), где True, False, True на самом деле означают: игнорировать регистр, не инвертировать совпадение, шаблон — регулярное выражение Perl. Было бы неплохо заставить использовать единственный разумный вид вызова:
grep(text, pattern,
ignore_case=True,
perl_regexp=True)
Чтобы достичь этого результата, следует разместить обязательные именованные аргументы после аргумента переменной длины (также известного как
*args):
def grep(
text, pattern, *args,
ignore_case=False,
invert_match=False,
perl_regexp=False,
):
pass
Если вам не нужен
*args (как в примере), просто замените его на одиночную звездочку:
def grep(
text, pattern, *,
ignore_case=False,
invert_match=False,
perl_regexp=False,
):
pass
👉
Популярный способ объявить абстрактный метод в Python — использовать исключение
Хотя этот способ довольно популярен и даже поддерживается IDE (PyCharm считает такой метод абстрактным), у него есть недостаток. Ошибка возникает только при вызове метода, а не при создании экземпляра класса.
Используйте
👉
NotImplementedError:
def human_name(self):
raise NotImplementedError
Хотя этот способ довольно популярен и даже поддерживается IDE (PyCharm считает такой метод абстрактным), у него есть недостаток. Ошибка возникает только при вызове метода, а не при создании экземпляра класса.
Используйте
abc, чтобы избежать этой проблемы:
from abc import ABCMeta, abstractmethod
class Service(metaclass=ABCMeta):
def human_name(self):
pass
👉
Реализация парсеров с Pylasu
В этой статье рассказывается, как реализовать парсеры на Python с использованием Pylasu и ANTLR. Пошагово:
1. Создадим грамматику ANTLR для простого языка программирования Slang и сгенерируем парсер.
2. Определим абстрактное синтаксическое дерево (AST) с помощью Pylasu и научимся строить его из дерева разбора ANTLR.
3. Интегрируем парсер с CLI-приложением для обработки кода Slang из строк и файлов, с выводом AST в формате JSON.
Полный код проекта доступен на GitHub. Вы можете экспериментировать, вносить улучшения и делиться идеями!
https://tomassetti.me/implement-parsers-with-pylasu/
👉
В этой статье рассказывается, как реализовать парсеры на Python с использованием Pylasu и ANTLR. Пошагово:
1. Создадим грамматику ANTLR для простого языка программирования Slang и сгенерируем парсер.
2. Определим абстрактное синтаксическое дерево (AST) с помощью Pylasu и научимся строить его из дерева разбора ANTLR.
3. Интегрируем парсер с CLI-приложением для обработки кода Slang из строк и файлов, с выводом AST в формате JSON.
Полный код проекта доступен на GitHub. Вы можете экспериментировать, вносить улучшения и делиться идеями!
https://tomassetti.me/implement-parsers-with-pylasu/
👉
This media is not supported in your browser
VIEW IN TELEGRAM
Самый простой способ добавить вход по волшебной ссылке с использованием Django ✉️
Статья объясняет, как реализовать вход через "магическую ссылку" в Django. Описаны этапы настройки кастомной модели пользователя, конфигурации email-бэкендов, создания ссылок для верификации, а также добавления необходимых представлений и шаблонов.
Этот метод позволяет пользователям безопасно входить в систему без паролей, подтверждая вход через ссылку в email.
https://www.photondesigner.com/articles/email-sign-in
👉
Статья объясняет, как реализовать вход через "магическую ссылку" в Django. Описаны этапы настройки кастомной модели пользователя, конфигурации email-бэкендов, создания ссылок для верификации, а также добавления необходимых представлений и шаблонов.
Этот метод позволяет пользователям безопасно входить в систему без паролей, подтверждая вход через ссылку в email.
https://www.photondesigner.com/articles/email-sign-in
👉
Python предоставляет мощную библиотеку для работы с датой и временем: datetime. Интересный момент заключается в том, что объекты datetime имеют специальный интерфейс для поддержки часовых поясов (а именно атрибут tzinfo), но этот модуль поддерживает интерфейс лишь частично, оставляя остальную часть задачи другим модулям.
Наиболее популярный модуль для этой задачи — pytz. Однако сложность в том, что pytz не полностью соответствует интерфейсу tzinfo. Документация pytz указывает на это одной из первых строк: «Эта библиотека отличается от документированного API Python для реализаций tzinfo».
Нельзя использовать объекты часовых поясов pytz в качестве атрибута tzinfo. Если попытаться это сделать, можно получить абсолютно неожиданные результаты.
Посмотрите на этот смещение +00:09. Правильное использование pytz выглядит следующим образом:
Кроме того, после любых арифметических операций вам следует нормализовать объект datetime на случай изменения смещения (например, на границе периода летнего времени).
Начиная с Python 3.6, рекомендуется использовать dateutil.tz вместо pytz. Он полностью совместим с tzinfo, может быть передан как атрибут, не требует нормализации, хотя работает немного медленнее.
👉
Наиболее популярный модуль для этой задачи — pytz. Однако сложность в том, что pytz не полностью соответствует интерфейсу tzinfo. Документация pytz указывает на это одной из первых строк: «Эта библиотека отличается от документированного API Python для реализаций tzinfo».
Нельзя использовать объекты часовых поясов pytz в качестве атрибута tzinfo. Если попытаться это сделать, можно получить абсолютно неожиданные результаты.
In : paris = pytz.timezone('Europe/Paris')
In : str(datetime(2017, 1, 1, tzinfo=paris))
Out: '2017-01-01 00:00:00+00:09'
Посмотрите на этот смещение +00:09. Правильное использование pytz выглядит следующим образом:
In : str(paris.localize(datetime(2017, 1, 1)))
Out: '2017-01-01 00:00:00+01:00'
Кроме того, после любых арифметических операций вам следует нормализовать объект datetime на случай изменения смещения (например, на границе периода летнего времени).
In : new_time = time + timedelta(days=2)
In : str(new_time)
Out: '2018-03-27 00:00:00+01:00'
In : str(paris.normalize(new_time))
Out: '2018-03-27 01:00:00+02:00'
Начиная с Python 3.6, рекомендуется использовать dateutil.tz вместо pytz. Он полностью совместим с tzinfo, может быть передан как атрибут, не требует нормализации, хотя работает немного медленнее.
👉
Функция enumerate
Эта встроенная функция снабжает циклы счётчиком. Возвращает генераторный объект, который имеет метод, вызываемый встроенной функцией next: на каждом проходе цикла возвращает кортеж {индекс, значение}. Цикл for проходит по этим кортежам автоматически, что позволяет распаковывать их значения с помощью присваивания кортежей почти так, как в zip.
Пример использования:
👉
Эта встроенная функция снабжает циклы счётчиком. Возвращает генераторный объект, который имеет метод, вызываемый встроенной функцией next: на каждом проходе цикла возвращает кортеж {индекс, значение}. Цикл for проходит по этим кортежам автоматически, что позволяет распаковывать их значения с помощью присваивания кортежей почти так, как в zip.
S = "stroka"
example = enumerate(S)
next(example) # -> (0, 's')
Пример использования:
shopping_list = ['яблоки', 'бананы', 'апельсины', 'хлеб']
for index, item in enumerate(shopping_list, start=1):
print(f"Пункт {index}: {item}")
👉
Вредные советы python разработчику
В Python можно выпрямить вложенные списки с помощью... функции
Дело в том, что
👉
l=[['a', 'b', 'c'], ['1', '2'], ['#']]
sum(l, [])
В Python можно выпрямить вложенные списки с помощью... функции
sum(). Вот код (выполнять, пока никто не видит):Дело в том, что
sum() принимает первым аргументом итерируемый объект, а вторым — значение, с которого начинается операция. По умолчанию это 0, но если указать пустой список [], то sum() начнёт с него. Затем sum() последовательно применяет операцию сложения к элементам первого аргумента, начиная со значения второго аргумента. В случае списков это означает конкатенацию.👉
Что такое контекстный менеджер в Python?
Контекстный менеджер в Python — это специальный тип объекта, который определяет методы
Частый сценарий — это работа с файлом:
Здесь контекстный менеджер гарантирует, что файл будет корректно закрыт после завершения блока with, даже если при чтении файла возникнет исключение.
Вот как можно написать простой контекстный менеджер самостоятельно:
👉
Контекстный менеджер в Python — это специальный тип объекта, который определяет методы
enter() и exit() и используется с инструкцией with. Эти объекты часто применяются в операциях, которые требуют установки и освобождения ресурсов. Частый сценарий — это работа с файлом:
with open('file.txt', 'r') as file:
data = file.read()
Здесь контекстный менеджер гарантирует, что файл будет корректно закрыт после завершения блока with, даже если при чтении файла возникнет исключение.
Вот как можно написать простой контекстный менеджер самостоятельно:
import time
class Timer:
def __enter__(self):
self.start = time.time()
def __exit__(self, exc_type, exc_val, exc_tb):
self.end = time.time()
print(f'Время выполнения: {self.end - self.start:.2f} секунд')
with Timer():
# код, время выполнения которого нужно измерить
time.sleep(2)
👉
Обзор библиотеки RxPY
Сегодня поговорим о хорошей библиотеке для управления потоками данных в Python – RxPY — реализации Reactive Extensions для нашего любимого языка. В версии 4.0.4 эта библиотека получила ряд улучшений, и сегодня мы разберем её основной функционал.
Основы RxPY
RxPY — это библиотека, реализующая принципы функционального реактивного программирования в Python. Она позволяет создавать и управлять асинхронными потоками данных, объединяя их, фильтруя и трансформируя с помощью цепочек операторов. Основные компоненты RxPY:
Observable: источник данных, который может выдавать события.
Observer: подписчик, который реагирует на события от Observable.
Операторы: функции, позволяющие трансформировать, фильтровать и комбинировать Observable.
https://habr.com/ru/companies/otus/articles/849810/
👉
Сегодня поговорим о хорошей библиотеке для управления потоками данных в Python – RxPY — реализации Reactive Extensions для нашего любимого языка. В версии 4.0.4 эта библиотека получила ряд улучшений, и сегодня мы разберем её основной функционал.
Основы RxPY
RxPY — это библиотека, реализующая принципы функционального реактивного программирования в Python. Она позволяет создавать и управлять асинхронными потоками данных, объединяя их, фильтруя и трансформируя с помощью цепочек операторов. Основные компоненты RxPY:
Observable: источник данных, который может выдавать события.
Observer: подписчик, который реагирует на события от Observable.
Операторы: функции, позволяющие трансформировать, фильтровать и комбинировать Observable.
https://habr.com/ru/companies/otus/articles/849810/
👉
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Media is too big
VIEW IN TELEGRAM
Создание ботов на Python с использованием aiogram
Создание Telegram ботов на AIOGRAM 3.4
Фильтры и работа с сообщениями на AIOGRAM 3.4
Роутеры и структура Telegram бота на AIOGRAM 3.4
Клавиатура в Телеграм Ботах - Inline Reply и Builder на AIOGRAM 3.4
CallbackQuery на AIOGRAM 3.4
FSM Context - машина состояний на AIOGRAM 3.4
Middleware на AIOGRAM 3.4
Телеграм Бот на Python с нуля! | Telegram Bot на Aiogram для начинающих
База Данных и Выгрузка на Сервер Телеграм Бота на Python - Aiogram 3
PostgreSQL + Скрытие Токена в .env - Aiogram 3
ДЕПЛОЙ БОТА НА СЕРВЕР | AIOGRAM 3
To Do БОТ на Python для ТЕЛЕГРАМ | AIOGRAM EASY BOT #1
источник
👉
Создание Telegram ботов на AIOGRAM 3.4
Фильтры и работа с сообщениями на AIOGRAM 3.4
Роутеры и структура Telegram бота на AIOGRAM 3.4
Клавиатура в Телеграм Ботах - Inline Reply и Builder на AIOGRAM 3.4
CallbackQuery на AIOGRAM 3.4
FSM Context - машина состояний на AIOGRAM 3.4
Middleware на AIOGRAM 3.4
Телеграм Бот на Python с нуля! | Telegram Bot на Aiogram для начинающих
База Данных и Выгрузка на Сервер Телеграм Бота на Python - Aiogram 3
PostgreSQL + Скрытие Токена в .env - Aiogram 3
ДЕПЛОЙ БОТА НА СЕРВЕР | AIOGRAM 3
To Do БОТ на Python для ТЕЛЕГРАМ | AIOGRAM EASY BOT #1
источник
👉