Типизация в Python
Динамическая типизация позволяет определять и изменять тип переменных во время выполнения программы, в отличие от статической, при которой типы данных определяются на этапе компиляции и не подлежат изменениям. Динамическая типизация позволяет уменьшить сложность кода, но при этом возрастает риск появления ошибок, связанных с неправильным типом данных.
Аннотации типов можно использовать для типизации функций Python. В функциях можно аннотировать аргументы функций, их возвращаемые значения, декораторы функции и т.д.
https://telegra.ph/Tipizaciya-v-Python-11-01
👉@BookPython
Динамическая типизация позволяет определять и изменять тип переменных во время выполнения программы, в отличие от статической, при которой типы данных определяются на этапе компиляции и не подлежат изменениям. Динамическая типизация позволяет уменьшить сложность кода, но при этом возрастает риск появления ошибок, связанных с неправильным типом данных.
Аннотации типов можно использовать для типизации функций Python. В функциях можно аннотировать аргументы функций, их возвращаемые значения, декораторы функции и т.д.
def find_max(numbers: List[int]) -> int:
if not numbers:
raise ValueError(“Список пуст”)
max_value: int = numbers[0]
for num in numbers:
if num > max_value:
max_value = num
return max_value
https://telegra.ph/Tipizaciya-v-Python-11-01
👉@BookPython
Самый быстрый способ чтения Excel в Python: чтение 500 тысяч строк менее чем за 4 секунды
У меня нет данных, чтобы подтвердить это утверждение, но я почти уверен, что Excel — самый распространённый способ хранения, обработки и, да(!), даже передачи данных. Именно поэтому нередко приходится работать с Excel в Python. Недавно мне понадобилось это сделать, и я протестировал и оценил несколько способов чтения файлов Excel в Python.
https://hakibenita.com/fast-excel-python#results-summary
👉@BookPython
У меня нет данных, чтобы подтвердить это утверждение, но я почти уверен, что Excel — самый распространённый способ хранения, обработки и, да(!), даже передачи данных. Именно поэтому нередко приходится работать с Excel в Python. Недавно мне понадобилось это сделать, и я протестировал и оценил несколько способов чтения файлов Excel в Python.
https://hakibenita.com/fast-excel-python#results-summary
👉@BookPython
Поиск самой быстрой JSON-библиотеки на Python (8 сравнений)
Большинство тестов производительности, подобных этому, включают всего четыре библиотеки JSON: обычно стандартную библиотеку JSON, orjson, ujson и rapidjson. Однако, благодаря моему максималистскому подходу, я решил пойти гораздо дальше и найти все библиотеки JSON, которые так или иначе можно использовать, и протестировать их. Таким образом я обнаружил некоторых «новых игроков», таких как cysimdjson, yapic.json и pysimdjson.
orjson: ijl/orjson
pysimdjson: TkTech/pysimdjson
yapic.json: zozzz/yapic.json
simplejson: simplejson/simplejson
ujson: ultrajson/ultrajson
python-rapidjson: python-rapidjson/python-rapidjson
cysimdjson: TeskaLabs/cysimdjson
nujson (deprecated): caiyunapp/ultrajson
https://catnotfoundnear.github.io/finding-the-fastest-python-json-library-on-all-python-versions-8-compared.html
👉@BookPython
Большинство тестов производительности, подобных этому, включают всего четыре библиотеки JSON: обычно стандартную библиотеку JSON, orjson, ujson и rapidjson. Однако, благодаря моему максималистскому подходу, я решил пойти гораздо дальше и найти все библиотеки JSON, которые так или иначе можно использовать, и протестировать их. Таким образом я обнаружил некоторых «новых игроков», таких как cysimdjson, yapic.json и pysimdjson.
orjson: ijl/orjson
pysimdjson: TkTech/pysimdjson
yapic.json: zozzz/yapic.json
simplejson: simplejson/simplejson
ujson: ultrajson/ultrajson
python-rapidjson: python-rapidjson/python-rapidjson
cysimdjson: TeskaLabs/cysimdjson
nujson (deprecated): caiyunapp/ultrajson
https://catnotfoundnear.github.io/finding-the-fastest-python-json-library-on-all-python-versions-8-compared.html
👉@BookPython
Декораторы Python: пошаговое руководство
Понимание декораторов является важной вехой для любого программиста Python. Эта статья представляет собой пошаговое руководство о том, как декораторы могут помочь вам стать более эффективным и продуктивным разработчиком на Python.
Декораторы в Python позволяют расширять и изменять поведение вызываемых объектов (функций, методов и классов) без постоянного изменения самого вызываемого объекта.
Любая достаточно общая функциональность, которую можно «прикрепить» к поведению существующего класса или функции, является отличным примером использования декораторов.
Сюда входит:
- журналирование,
- обеспечение контроля доступа и аутентификации,
- инструментарий и функции управления временем,
- ограничение скорости,
- кэширование и многое другое.
Rus https://habr.com/ru/companies/otus/articles/727590/
Eng https://dbader.org/blog/python-decorators
👉@BookPython
Понимание декораторов является важной вехой для любого программиста Python. Эта статья представляет собой пошаговое руководство о том, как декораторы могут помочь вам стать более эффективным и продуктивным разработчиком на Python.
Декораторы в Python позволяют расширять и изменять поведение вызываемых объектов (функций, методов и классов) без постоянного изменения самого вызываемого объекта.
Любая достаточно общая функциональность, которую можно «прикрепить» к поведению существующего класса или функции, является отличным примером использования декораторов.
Сюда входит:
- журналирование,
- обеспечение контроля доступа и аутентификации,
- инструментарий и функции управления временем,
- ограничение скорости,
- кэширование и многое другое.
Rus https://habr.com/ru/companies/otus/articles/727590/
Eng https://dbader.org/blog/python-decorators
👉@BookPython
Python 3.13, что не попало в заголовки
Python 3.13 — отличный релиз, полный различных фич и улучшений, но уже есть тонна статей, которые подробно разбирают release notes. Если вам нужна хорошая выжимка — у RealPython есть хорошая статья, но я не вижу смысла проходиться по ним еще раз в этой статье.
Так что мы не будем говорить про новый REPL, no‑GIL сборку, экспериментальный JIT‑компилятор, устаревшие штуки, новые плюшки системы типов или улучшенные сообщения об ошибках (как всегда, мое любимое).
Вместо этого я прочитал коротенькую книжку, которую они называют ченджлогом и мы посмотрим на то, о чем многие не говорили, но заинтересовало лично меня.
https://habr.com/ru/companies/beget/articles/856288/
original https://www.bitecode.dev/p/python-313-what-didnt-make-the-headlines
👉@BookPython
Python 3.13 — отличный релиз, полный различных фич и улучшений, но уже есть тонна статей, которые подробно разбирают release notes. Если вам нужна хорошая выжимка — у RealPython есть хорошая статья, но я не вижу смысла проходиться по ним еще раз в этой статье.
Так что мы не будем говорить про новый REPL, no‑GIL сборку, экспериментальный JIT‑компилятор, устаревшие штуки, новые плюшки системы типов или улучшенные сообщения об ошибках (как всегда, мое любимое).
Вместо этого я прочитал коротенькую книжку, которую они называют ченджлогом и мы посмотрим на то, о чем многие не говорили, но заинтересовало лично меня.
https://habr.com/ru/companies/beget/articles/856288/
original https://www.bitecode.dev/p/python-313-what-didnt-make-the-headlines
👉@BookPython
Зачем нужен pdb?
Основные возможности
1. Точки останова (breakpoints): Можно установить точку в коде, где выполнение программы остановится, чтобы проверить текущее состояние переменных и выполнения.
2. Шаговое выполнение кода:
-
-
-
3. Просмотр значений переменных:
- Можно вводить имя переменной, чтобы узнать ее текущее значение на любой остановке программы.
- Можно выполнять Python-команды прямо в отладчике для анализа данных.
4. Отслеживание стека вызовов:
- Команды
5. Динамическое изменение кода:
- Во время отладки можно изменять значения переменных, что помогает тестировать различные сценарии и предположения прямо во время выполнения программы.
Пример использования
Этот пример вызовет ошибку деления на ноль, и отладчик
Когда использовать
- Для диагностики сложных ошибок, которые трудно отследить с помощью обычных
- При разработке и тестировании сложных функций или алгоритмов.
- В ситуациях, когда необходимо детально понять, почему код работает не так, как ожидалось.
👉@BookPython
pdb
(Python Debugger) — это встроенный отладчик Python, который помогает разработчикам находить и исправлять ошибки в коде. С помощью pdb
можно управлять выполнением программы шаг за шагом, просматривать и изменять значения переменных, устанавливать точки останова и диагностировать причину ошибок. Вот основные функции и задачи pdb
:Основные возможности
pdb
:1. Точки останова (breakpoints): Можно установить точку в коде, где выполнение программы остановится, чтобы проверить текущее состояние переменных и выполнения.
import pdb; pdb.set_trace() # Остановка программы в этом месте
2. Шаговое выполнение кода:
-
n
(next) — Выполняет следующую строку кода.-
s
(step) — Переходит внутрь функции, если строка кода — это вызов функции.-
c
(continue) — Продолжает выполнение до следующей точки останова.3. Просмотр значений переменных:
- Можно вводить имя переменной, чтобы узнать ее текущее значение на любой остановке программы.
- Можно выполнять Python-команды прямо в отладчике для анализа данных.
4. Отслеживание стека вызовов:
- Команды
where
или w
показывают текущий стек вызовов, что помогает понять, в какой части программы находится ошибка.5. Динамическое изменение кода:
- Во время отладки можно изменять значения переменных, что помогает тестировать различные сценарии и предположения прямо во время выполнения программы.
Пример использования
pdb
:
import pdb
def divide(a, b):
pdb.set_trace() # Остановка для проверки переменных
return a / b
result = divide(10, 0)
print(result)
Этот пример вызовет ошибку деления на ноль, и отладчик
pdb
остановится перед ошибкой, что позволит просмотреть значения a
и b
.Когда использовать
pdb
- Для диагностики сложных ошибок, которые трудно отследить с помощью обычных
print()
или logging
.- При разработке и тестировании сложных функций или алгоритмов.
- В ситуациях, когда необходимо детально понять, почему код работает не так, как ожидалось.
pdb
— мощный инструмент, который помогает программистам эффективно находить ошибки и улучшать качество кода.👉@BookPython
Создаем чат-бота на Python: Полное руководство
В статье автор рассказывает, как создать чат-бота на Python с использованием библиотек NLTK и TensorFlow. Она охватывает подготовку среды разработки, обработку текста, обучение модели и интеграцию её в бота. Даны примеры кода для выполнения каждой задачи, включая обработку текста, построение модели и реализацию логики ответов. В статье также приведены полезные ресурсы для дальнейшего изучения NLP и машинного обучения.
https://habr.com/ru/articles/792148/
👉@BookPython
В статье автор рассказывает, как создать чат-бота на Python с использованием библиотек NLTK и TensorFlow. Она охватывает подготовку среды разработки, обработку текста, обучение модели и интеграцию её в бота. Даны примеры кода для выполнения каждой задачи, включая обработку текста, построение модели и реализацию логики ответов. В статье также приведены полезные ресурсы для дальнейшего изучения NLP и машинного обучения.
https://habr.com/ru/articles/792148/
👉@BookPython
Хабр
Создаем чат-бота на Python: Полное руководство
Введение В эпоху цифровизации чат‑боты становятся все более важным инструментом для бизнеса, образования и личного использования. Они помогают автоматизировать обслуживание клиентов,...
Django REST Framework и Vue против Django и HTMX
Статья сравнивает два подхода к созданию веб-приложений с Django: использование Django REST Framework (DRF) и Vue.js для полного разделения фронтенда и бэкенда, а также использование Django с HTMX для более интегрированного подхода с серверным рендерингом. В статье обсуждаются плюсы и минусы каждого из этих решений, включая вопросы сложности, производительности и удобства для разработчика.
https://testdriven.io/blog/drf-vue-vs-django-htmx/
👉@BookPython
Статья сравнивает два подхода к созданию веб-приложений с Django: использование Django REST Framework (DRF) и Vue.js для полного разделения фронтенда и бэкенда, а также использование Django с HTMX для более интегрированного подхода с серверным рендерингом. В статье обсуждаются плюсы и минусы каждого из этих решений, включая вопросы сложности, производительности и удобства для разработчика.
https://testdriven.io/blog/drf-vue-vs-django-htmx/
👉@BookPython
Подборка Telegram каналов для программистов
https://t.me/piterspb Канал о Санкт-Петербурге 🌇❤️💙
Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин 👩
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
https://t.me/Excel_lifehack
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
https://t.me/piterspb Канал о Санкт-Петербурге 🌇❤️💙
Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин 👩
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
https://t.me/Excel_lifehack
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Совет по Python💡
Вы можете использовать
Пример 👆
👉@BookPython
Вы можете использовать
any()
, чтобы проверить, является ли любой элемент в iterable
истинным.Пример 👆
👉@BookPython
Scrapy - это лицензированный BSD быстрый высокоуровневый фреймворк для веб-скраппинга, используемый для просмотра веб-сайтов и извлечения структурированных данных с их страниц. Его можно использовать для самых разных целей, от добычи данных до мониторинга и автоматизированного тестирования.
https://pypi.org/project/Scrapy/
👉@BookPython
https://pypi.org/project/Scrapy/
👉@BookPython
PyPI
Scrapy
A high-level Web Crawling and Web Scraping framework
UV
Чрезвычайно быстрый менеджер пакетов и проектов на языке Python, написанный на Rust.
Создатели позиционируют его как замену pip, pip-tools и virtualenv. Это, кстати, те же разработчики, которые сделали линтер Ruff.
https://astral.sh/blog/uv
https://github.com/astral-sh/uv
👉@BookPython
Чрезвычайно быстрый менеджер пакетов и проектов на языке Python, написанный на Rust.
Создатели позиционируют его как замену pip, pip-tools и virtualenv. Это, кстати, те же разработчики, которые сделали линтер Ruff.
https://astral.sh/blog/uv
https://github.com/astral-sh/uv
👉@BookPython
Блок
Вывод:
👉@BookPython
else
для выражений for
и try
используется довольно редко. Однако, комбинируя их вместе, можно написать код, который выполняет итерацию по коллекции до первого успешного результата без использования дополнительных флагов.
import logging
from typing import List, Optional
logging.basicConfig(level=logging.DEBUG)
def first_int(iterable: List[str]) -> Optional[int]:
for x in iterable:
try:
result = int(x)
except ValueError:
logging.debug('Bad int: %s', x)
else:
break
else:
result = None
logging.error('No int found')
return result
print(first_int(('a', 'b', '42', 'c')))
Вывод:
DEBUG:root:Bad int: a
DEBUG:root:Bad int: b
42
👉@BookPython
В Python 3 методы
Можно утверждать, что индексация ключей не особо нужна, так как их порядок случайный, но это не совсем так. Во-первых,
👉@BookPython
keys
, values
и items
для словарей возвращают объекты-представления (view objects). В Python 2 они возвращали списки. Основное различие в том, что представления не хранят все элементы в памяти, а предоставляют их по мере запроса. Это работает отлично, пока вы просто итерируете ключи (что обычно и делается), но теперь вы не можете получить доступ к элементам по индексу.
TypeError: 'dict_keys' object does not support indexing
Можно утверждать, что индексация ключей не особо нужна, так как их порядок случайный, но это не совсем так. Во-первых,
d.keys()[0]
может быть удобным способом получить любой ключ (используйте next(iter(d.keys()))
в Python 3). Во-вторых, начиная с Python 3.6, словари в CPython упорядочены по порядку добавления, и с версии Python 3.7 это стало стандартной особенностью языка.👉@BookPython
Если
А вот зачем:
👉@BookPython
dict
запоминает порядок элементов в Python 3.6+, тогда зачем нужен collections.OrderedDict
? А вот зачем:
>>> OrderedDict(a=1, b=2) == OrderedDict(b=2, a=1)
False
>>> dict(a=1, b=2) == dict(b=2, a=1)
True
👉@BookPython
Известный синтаксис декораторов в Python (
По сути, идентификатор после
👉@BookPython
@this_one
) — это способ вызова функции высшего порядка. Раньше людям приходилось делать это вручную:
# prior to Python 2.4
def query():
pass
query = atomic(query)
# now
@atomic
def query():
pass
По сути, идентификатор после
@
— это то, что будет вызвано. Можно также использовать идентификатор со скобками (@atomic(skip_errors=True)
), что обычно используется для параметризированных декораторов. Также работает что-то вроде @decorators.db.atomic(True)
. Кажется, что любой вид выражения можно использовать в качестве декоратора, но это не так. После @
должен следовать один «дот-идентификатор» (например, decorators.atomic) и, при необходимости, одна пара скобок с аргументами (как вызов функции). Так что @decorators[2]
использовать нельзя. Вот строка из грамматики Python:
decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
👉@BookPython
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
Вы когда-нибудь задумывались, почему при попытке выйти из интерактивного Python с помощью простого
exit
или quit
появляется это сообщение? Решение довольно неожиданное, но изящное. Это не специальный случай для интерактивной оболочки, она просто показывает представление каждого вычисленного результата, а эта строка - просто представление функции exit.Строго говоря, вы не должны использовать exit в своих повседневных проектах, поскольку она была создана специально для интерактивной оболочки. Вместо этого используйте
sys.exit()
.👉@BookPython
Если вы хотите перехватить как
👉@BookPython
IndexError
, так и KeyError
, вы можете и должны использовать LookupError
, их общего предка. Это оказалось полезным при доступе к сложным вложенным данным.
try:
db_host = config['databases'][0]['hosts'][0]
except LookupError:
db_host = 'localhost'
👉@BookPython
Python 3 позволяет сделать некоторые аргументы функции обязательными именованными аргументами, что означает, что их нужно передавать как
Это может быть полезно, чтобы предотвратить вызовы функции вроде:
Чтобы достичь этого результата, следует разместить обязательные именованные аргументы после аргумента переменной длины (также известного как
Если вам не нужен
👉@BookPython
(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
👉@BookPython
Популярный способ объявить абстрактный метод в Python — использовать исключение
Хотя этот способ довольно популярен и даже поддерживается IDE (PyCharm считает такой метод абстрактным), у него есть недостаток. Ошибка возникает только при вызове метода, а не при создании экземпляра класса.
Используйте
👉@BookPython
NotImplementedError
:
def human_name(self):
raise NotImplementedError
Хотя этот способ довольно популярен и даже поддерживается IDE (PyCharm считает такой метод абстрактным), у него есть недостаток. Ошибка возникает только при вызове метода, а не при создании экземпляра класса.
Используйте
abc
, чтобы избежать этой проблемы:
from abc import ABCMeta, abstractmethod
class Service(metaclass=ABCMeta):
@abstractmethod
def human_name(self):
pass
👉@BookPython