StringIO и BytesIO — это классы из стандартной библиотеки, которые позволяют обрабатывать строки и байты как файлоподобные объекты.
StringIO предназначен для работы с текстом. Он позволяет записывать строки в объект и считывать их оттуда же, имитируя файловый интерфейс. Это удобно для работы со строками в местах, где ожидается файл — например, для mock-объектов.
BytesIO выполняет ту же роль для байтов — позволяет записывать байты в объект и считывать их как файл. Это удобно для имитации файлового ввода/вывода в памяти или для работы с двоичными данными.
В целом, эти классы упрощают работу с текстом и двоичными данными, эмулируя файловый интерфейс для строк и байтов в памяти.
В конструктор исключения можно передать любые аргументы, которые помогут потом разобраться в причине возникновения исключения.
Обычно в конструктор передают как минимум сообщение, описывающее проблему. Это позволяет потом вывести это сообщение с помощью метода args исключения и таким образом понять, что именно пошло не так.
Также хорошей практикой считается передавать код ошибки — некий уникальный идентификатор проблемы. Это упрощает обработку конкретных исключений в программе.
Модуль warning используется для вывода предупреждений во время выполнения программы.
Предупреждения отличаются от исключений тем, что не прерывают нормальный ход программы. Они позволяют уведомить разработчика о потенциальных проблемах или нежелательных ситуациях в коде, но при этом не останавливать его выполнение.
Основные причины для использования предупреждений: — Уведомить о неэффективных конструкциях в коде, которые можно оптимизировать. — Предупредить об устаревших методах или функциях, которые могут быть удалены в будущих версиях. — Обозначить использование ненадежных внешних данных или API. — Выявить подозрительные ситуации, которые не являются критичными ошибками, но требуют внимания.
Локальные потоки в Python обеспечивают способ хранения данных, уникальных для каждого потока. Они гарантируют, что каждый поток имеет свою отдельную копию данных, изолированную от других потоков. Для создания локальных объектов в Python используется класс threading.local().
В этом примере мы создаем объект thread-local с помощью threading.local(). Внутри функции мы устанавливаем специфические для потока данные с помощью set_data и извлекаем их с помощью get_data. Каждый поток печатает свое уникальное сообщение, указывающее на идентификатор потока.
Когда код будет запущен, вы увидите, что каждый поток печатает свое собственное сообщение, подтверждая, что у них есть свои отдельные копии данных thread-local. Объект thread-local позаботится об очистке данных после завершения выполнения потока.
Локальные данные потоков обеспечивают удобный способ поддержания состояния, специфичного для конкретного потока, без явной передачи данных между потоками.
В Python есть встроенная функция type(), которая позволяет создавать классы динамически. Она принимает три аргумента: имя класса, кортеж базовых классов (если они есть) и словарь атрибутов класса.
*Несмотря на то, что это технически возможно, использование инструкции class предпочтительнее и более понятно для создания классов.
Что значит *args, **kwargs? И зачем нам их использовать?
Мы используем *args, когда не уверены, сколько аргументов будет передано функции, или если хотим передать сохраненный список или кортеж аргументов функции.
**kwargs используется, когда мы не знаем, сколько аргументов ключевых слов будет передано, а также он может быть использован для передачи значений словаря в качестве аргументов ключевых слов. Идентификаторы args и kwargs необязательны, вы можете изменить их на другие, типа *другой **пример, но лучше использовать имя по умолчанию. #вопросы_с_собеседований
Модуль pickle принимает любой объект Python, преобразует его в строковое представление и сохраняет в файл с помощью функции dump, такой процесс называется pickling.
Процесс извлечения исходных объектов Python из сохраненного строкового представления называется unpickling.
Магические методы — это специальные методы класса, которые начинаются и заканчиваются двумя символами подчеркивания.
Они вызываются автоматически интерпретатором Python при определенных действиях и используются для эмуляции встроенных в язык структур и функций.
Реализуя магические методы в своем классе, программист может определить поведение класса при различных операциях и сделать его похожим на встроенные типы.
Что такое wheel и eggs в Python? Какая между ними разница?
Python wheel — это стандартный формат установки дистрибутивов Python, который содержит все файлы и метаданные, необходимые для установки. Файл WHL также содержит информацию о версиях и платформах Python, поддерживаемых этим файлом. Расширение файла wheel — .whl
Python egg — это сжатый архив ZIP, содержащий исходные файлы приложения Python вместе с метаинформацией о дистрибутиве. Расширение файла egg — .egg
Основная разница заключается в том, что wheel предоставляет более простой и надежный способ установки пакетов. В отличие от eggs, он не требует установки дополнительных зависимостей и обеспечивает более быстрое время установки. Кроме того, wheel поддерживает все платформы, на которых может работать Python.
Модуль __init__.py является частью организации пакетов (packages) в Python. Этот файл используется для определения директории как пакета и может содержать код и переменные, которые будут доступны при импорте пакета. Важно отметить, что __init__.py не является обязательным для всех директорий, но он необходим, чтобы Python интерпретировал директорию как пакет.