collections.MutableMapping
Collections.MutableMapping — это интерфейс, который представляет изменяемое отображение (словарь).
Он наследуется от интерфейса
Основное преимущество в использовании
Например, во многих функциях в стандартной библиотеке есть параметры типа
Collections.MutableMapping — это интерфейс, который представляет изменяемое отображение (словарь).
Он наследуется от интерфейса
Mapping
и добавляет методы для изменения отображения, такие как __setitem__
, __delitem__
и clear
. Основное преимущество в использовании
MutableMapping
— это возможность передавать экземпляры такого класса в любое API, ожидающее словарь. Например, во многих функциях в стандартной библиотеке есть параметры типа
dict
. Если создать класс, реализующий MutableMapping
, его экземпляры можно будет передавать в такие функции.Атрибут __slots__
Этот атрибут позволяет ограничить создание новых атрибутов в экземплярах класса.
Использование
Атрибут полезен, когда заранее известны все атрибуты класса и не нужна динамическая задача новых. Например, для простых данных или immutable классов.
#это_база
Этот атрибут позволяет ограничить создание новых атрибутов в экземплярах класса.
__slots__
определяется как список имен атрибутов в определении класса. Экземпляры класса с __slots__
могут иметь атрибуты только с именами, определенными в __slots__
. Попытка создать новый атрибут приведет к ошибке.Использование
__slots__
экономит память, так как экземпляры не создают словарь __dict__
для атрибутов.__slots__
не наследуются, для каждого подкласса нужно определять свои слоты.Атрибут полезен, когда заранее известны все атрибуты класса и не нужна динамическая задача новых. Например, для простых данных или immutable классов.
#это_база
Функции, поддерживающие только именованные аргументы (kwargs)
**kwargs (keyword arguments) — это способ передачи произвольного количества именованных аргументов в функцию.
В функциях после позиционных и обычных именованных аргументов указывают параметр
В
Благодаря этому через
Если одновременно используются
#это_база
**kwargs (keyword arguments) — это способ передачи произвольного количества именованных аргументов в функцию.
В функциях после позиционных и обычных именованных аргументов указывают параметр
**kwargs
.В
kwargs
передаются аргументы в виде ключ-значение. Внутри функции kwargs
становится словарем, где ключи — имена аргументов, значения — значения аргументов. Благодаря этому через
kwargs
можно передать любое количество дополнительных аргументов в функцию.Если одновременно используются
*args
и **kwargs
, то в вызове сначала указываются *args
.#это_база
#вопросы_с_собеседований
Что такое фабрика декораторов?
Фабрика декораторов — это особая разновидность функции высшего порядка, которая возвращает декоратор вместо прямого результата. Главное отличие фабрики декораторов от обычного декоратора в том, что она принимает аргументы, которые могут конфигурировать логику декоратора.
Например, фабрика может принимать имя лог-файла, в который будет производиться запись при вызове декорируемой функции. Или уровень логирования вместо простой записи всех вызовов.
Такой подход позволяет создавать переиспользуемые и гибко настраиваемые декораторы для решения разных задач.
Главные преимущества фабрик декораторов — это возможность абстрагироваться от конкретики реализации, избежать дублирования кода и создавать интуитивный API для декораторов с настройками.
Что такое фабрика декораторов?
Например, фабрика может принимать имя лог-файла, в который будет производиться запись при вызове декорируемой функции. Или уровень логирования вместо простой записи всех вызовов.
Такой подход позволяет создавать переиспользуемые и гибко настраиваемые декораторы для решения разных задач.
Главные преимущества фабрик декораторов — это возможность абстрагироваться от конкретики реализации, избежать дублирования кода и создавать интуитивный API для декораторов с настройками.
#вопросы_с_собеседований
Как Python ищет модули при импорте?
При импорте модулей интерпретатор следует определенному алгоритму поиска:
1. Сначала проверяются встроенные модули, которые поставляются в составе самого Python.
2. Затем по порядку просматриваются пути, перечисленные в sys.path — глобальной переменной, которая содержит список каталогов для поиска модулей.
По умолчанию в sys.path входят: текущий рабочий каталог скрипта, PYTHONPATH — каталоги указанные в этой переменной окружения, каталоги стандартной библиотеки Python.
3. Если модуль не найден — генерируется исключение ImportError.
Как Python ищет модули при импорте?
1. Сначала проверяются встроенные модули, которые поставляются в составе самого Python.
2. Затем по порядку просматриваются пути, перечисленные в sys.path — глобальной переменной, которая содержит список каталогов для поиска модулей.
По умолчанию в sys.path входят: текущий рабочий каталог скрипта, PYTHONPATH — каталоги указанные в этой переменной окружения, каталоги стандартной библиотеки Python.
3. Если модуль не найден — генерируется исключение ImportError.
Argcomplete
Она позволяет легко добавить автодополнение для
Библиотека работает в разных оболочках (bash, zsh и др.) без изменения кода и обладает простой интеграцией — достаточно декорировать функцию
Основные возможности
— Автоматическое дополнение имен файлов и каталогов при вводе путей.
— Предложение вариантов для аргументов на основе возможных значений, описанных через argparse.
— Дополнение для подкоманд в приложениях с вложенной структурой команд.
Argcomplete
— это библиотека для автодополнения аргументов командной строки. Она позволяет легко добавить автодополнение для
argparse
в интерактивных оболочках (например, bash, zsh). Библиотека работает в разных оболочках (bash, zsh и др.) без изменения кода и обладает простой интеграцией — достаточно декорировать функцию
argparse
декоратором @argcomplete.register
.Основные возможности
argcomplete
:— Автоматическое дополнение имен файлов и каталогов при вводе путей.
— Предложение вариантов для аргументов на основе возможных значений, описанных через argparse.
— Дополнение для подкоманд в приложениях с вложенной структурой команд.
#вопросы_с_собеседований
Что делать если нужно сериализовать данные, которые не поддерживаются стандартным модулем json?
Если нужно сериализовать объекты, которые по умолчанию не поддерживаются модулем json, то есть несколько вариантов:
— Реализовать методы __getattr__ и __setattr__ в классе объекта, чтобы преобразовать его в словарь, который уже можно сериализовать в JSON.
— Использовать декоратор dataclass из модуля dataclasses для автоматической генерации методов сериализации.
— Создать собственный класс-наследник json.JSONEncoder и переопределить метод default(), чтобы указать как сериализовать нестандартные объекты.
— Использовать библиотеку marshmallow для создания схем сериализации/десериализации сложных объектов в JSON.
— Преобразовать объекты в dict или list вручную перед сериализацией с помощью методов объекта или отражения (reflection).
— Использовать другой формат сериализации, например YAML или MessagePack, который может поддерживать произвольные типы.
Что делать если нужно сериализовать данные, которые не поддерживаются стандартным модулем json?
— Реализовать методы __getattr__ и __setattr__ в классе объекта, чтобы преобразовать его в словарь, который уже можно сериализовать в JSON.
— Использовать декоратор dataclass из модуля dataclasses для автоматической генерации методов сериализации.
— Создать собственный класс-наследник json.JSONEncoder и переопределить метод default(), чтобы указать как сериализовать нестандартные объекты.
— Использовать библиотеку marshmallow для создания схем сериализации/десериализации сложных объектов в JSON.
— Преобразовать объекты в dict или list вручную перед сериализацией с помощью методов объекта или отражения (reflection).
— Использовать другой формат сериализации, например YAML или MessagePack, который может поддерживать произвольные типы.
#вопросы_с_собеседований
Что такое сериализация?
Сериализация — это процесс преобразования объектов в поток байтов для сохранения или передачи.
Это позволяет сохранить состояние объекта в файл или базу данных и восстановить его позже.
Основные преимущества сериализации:
— Сохранение и восстановление объектов между сессиями программы.
— Передача объектов по сети между приложениями и машинами.
— Преобразование объектов в формат хранения, независимый от платформы.
Что такое сериализация?
Это позволяет сохранить состояние объекта в файл или базу данных и восстановить его позже.
Основные преимущества сериализации:
— Сохранение и восстановление объектов между сессиями программы.
— Передача объектов по сети между приложениями и машинами.
— Преобразование объектов в формат хранения, независимый от платформы.
Атрибут __all__
Атрибут
Этот атрибут должен содержать список имен, которые будут экспортированы.
Если
Использование
Это способствует лучшей структуре кода и предотвращает неожиданный экспорт внутренних элементов модуля.
Проще говоря,
#это_база
Атрибут
__all__
используется для контроля того, какие элементы модуля экспортируются при импорте с помощью from module import *
.Этот атрибут должен содержать список имен, которые будут экспортированы.
Если
__all__
не определен, то при импорте будут экспортированы все имена, не начинающиеся с _
. Использование
__all__
позволяет явно указать автору модуля, какие части модуля являются публичным API, а какие — внутренней реализацией. Это способствует лучшей структуре кода и предотвращает неожиданный экспорт внутренних элементов модуля.
Проще говоря,
__all__
— это простой механизм контроля области видимости при импорте. Он помогает организовать чистый публичный интерфейс модуля.#это_база
Plumbum
Она упрощает автоматизацию задач, которые требуют вызова командной строки из\ кода. Это может быть запуск скриптов, утилит, вызов программ для обработки данных и т. д.
Основные возможности библиотеки:
— Удобный синтаксис для запуска команд и программ из Python кода. Позволяет вызывать команды командной строки так же просто, как обычные функции.
— Автоматическое формирование командной строки. Можно передавать аргументы и параметры в виде обычных переменных,
— Перенаправление ввода/вывода. Поддержка стандартных операторов Unix для работы с потоками данных.
— Проверка кодов возврата и обработка ошибок.
— Локальное или удаленное выполнение. Возможность запускать команды как локально, так и по SSH на удаленных хостах.
Plumbum
— это библиотека, предназначенная для упрощения работы с командной строкой и вызова внешних программ. Она упрощает автоматизацию задач, которые требуют вызова командной строки из\ кода. Это может быть запуск скриптов, утилит, вызов программ для обработки данных и т. д.
Основные возможности библиотеки:
— Удобный синтаксис для запуска команд и программ из Python кода. Позволяет вызывать команды командной строки так же просто, как обычные функции.
— Автоматическое формирование командной строки. Можно передавать аргументы и параметры в виде обычных переменных,
Plumbum
сам сформирует командную строку.— Перенаправление ввода/вывода. Поддержка стандартных операторов Unix для работы с потоками данных.
— Проверка кодов возврата и обработка ошибок.
— Локальное или удаленное выполнение. Возможность запускать команды как локально, так и по SSH на удаленных хостах.
Pyspark
Основные возможности
—
— В
— Поддержка чтения и записи в разные хранилища данных и форматы файлов.
— Встроенные алгоритмы машинного обучения для классификации, кластеризации, регрессии.
— Интуитивно понятный API, позволяющий применять
Таким образом,
Pyspark
— это библиотека для работы с Apache Spark
на языке Python. Она позволяет выполнять распределенные вычисления на кластерах и обрабатывать большие объемы данных. Основные возможности
Pyspark
:—
Pyspark
автоматически распределяет данные и вычисления между узлами кластера для максимальной производительности.— В
Pyspark
есть специальные типы данных (RDD, DataFrame, Dataset), которые позволяют удобно работать с табличными и структурированными данными.— Поддержка чтения и записи в разные хранилища данных и форматы файлов.
— Встроенные алгоритмы машинного обучения для классификации, кластеризации, регрессии.
— Интуитивно понятный API, позволяющий применять
Pyspark
вместе с другими популярными библиотеками Python для анализа данных.Таким образом,
Pyspark
используется для быстрой параллельной обработки больших объемов данных с помощью кластеров, что делает его очень полезным инструментом для big data и машинного обучения.#вопросы_с_собеседований
Что будет, если декоратор не возвращает ничего?
Если декоратор не возвращает ничего, то происходит следующее:
— Декоратор заменяет оригинальную декорируемую функцию на значение None.
— При попытке вызвать декорированную функцию произойдет ошибка AttributeError, поскольку None не является вызываемым объектом.
— Выполнение декорируемого кода на самом деле не происходит.
— Декоратор фактически "срывает" работу декорируемой функции, делая ее невызываемой.
Чтобы этого избежать, декоратор обязательно должен возвращать некоторое вызываемое значение — либо оригинальную функцию, либо другую функцию-обёртку.
Таким образом, не возвращая ничего декоратор нарушает ожидаемое поведение и "ломает" декорируемый код.
Что будет, если декоратор не возвращает ничего?
— Декоратор заменяет оригинальную декорируемую функцию на значение None.
— При попытке вызвать декорированную функцию произойдет ошибка AttributeError, поскольку None не является вызываемым объектом.
— Выполнение декорируемого кода на самом деле не происходит.
— Декоратор фактически "срывает" работу декорируемой функции, делая ее невызываемой.
Чтобы этого избежать, декоратор обязательно должен возвращать некоторое вызываемое значение — либо оригинальную функцию, либо другую функцию-обёртку.
Таким образом, не возвращая ничего декоратор нарушает ожидаемое поведение и "ломает" декорируемый код.
#вопросы_с_собеседований
Что такое модульное программирование?
Модульное программирование — это подход к структурированию программного кода, при котором функциональность разбивается на отдельные модули.
Основные преимущества модульного программирования:
— Повышение читаемости и понятности кода, так как каждый модуль отвечает за определенную функциональность.
— Возможность многократного использования модулей в разных частях программы.
— Упрощение тестирования и отладки, поскольку каждый модуль можно тестировать отдельно.
— Возможность распараллеливания разработки за счет разделения труда в команде.
— Упрощение поддержки и модернизации кода за счет его модульности.
Что такое модульное программирование?
Основные преимущества модульного программирования:
— Повышение читаемости и понятности кода, так как каждый модуль отвечает за определенную функциональность.
— Возможность многократного использования модулей в разных частях программы.
— Упрощение тестирования и отладки, поскольку каждый модуль можно тестировать отдельно.
— Возможность распараллеливания разработки за счет разделения труда в команде.
— Упрощение поддержки и модернизации кода за счет его модульности.
Функция zip()
Функция
Итератор возвращает кортежи, содержащие i-й элемент из каждой из последовательностей. Количество элементов в итоговом итераторе равно длине самой короткой последовательности.
Результатом
#это_база
Функция
zip()
принимает в качестве аргументов последовательности (списки, кортежи и т.д.) и возвращает итератор с кортежами из элементов этих последовательностей. Итератор возвращает кортежи, содержащие i-й элемент из каждой из последовательностей. Количество элементов в итоговом итераторе равно длине самой короткой последовательности.
zip
можно использовать для "сшивания" вместе данных из нескольких списков. Например, имена и фамилии из двух списков можно комбинировать в один список имя-фамилия.Результатом
zip
является итератор, который можно превратить в список или кортеж. Также на результат можно применять различные операции, такие как цикл for
.zip
используется вместе с распаковкой кортежей, чтобы присвоить элементы нескольких итераторов переменным в цикле.#это_база
Функция sorted
Она возвращает новый отсортированный список или итератор, не изменяя исходную последовательность.
По умолчанию сортировка выполняется в возрастающем порядке. Для сортировки в убывающем порядке нужно указать аргумент
Для сортировки по определенному ключу можно использовать ключевой аргумент
Для сортировки объектов можно использовать атрибуты объекта в качестве ключа сортировки.
Сортировка происходит на месте для списков, и создаётся новый отсортированный список для кортежей и других неизменяемых последовательностей.
#это_база
sorted()
используется для сортировки элементов в списке, кортеже или другой последовательности. Она возвращает новый отсортированный список или итератор, не изменяя исходную последовательность.
По умолчанию сортировка выполняется в возрастающем порядке. Для сортировки в убывающем порядке нужно указать аргумент
reverse=True
. Для сортировки по определенному ключу можно использовать ключевой аргумент
key
. Он принимает функцию, которая извлекает ключ для сортировки из каждого элемента.Для сортировки объектов можно использовать атрибуты объекта в качестве ключа сортировки.
Сортировка происходит на месте для списков, и создаётся новый отсортированный список для кортежей и других неизменяемых последовательностей.
#это_база
Click
Основные преимущества
Возможности:
— Определение команд и групп команд с помощью декоратора
— Декларативное описание аргументов и опций.
— Автоматический парсинг аргументов командной строки.
— Генерация
— Поддержка
— Вложенные команды и группы подкоманд.
— Цветной вывод в терминал.
Click
— популярная библиотека для создания интерфейса командной строки (CLI) в приложениях Python. Основные преимущества
Click
— простота использования, элегантный и понятный код, мощные возможности по созданию комплексных CLI. Работает на Python 3.6 и выше.Возможности:
— Определение команд и групп команд с помощью декоратора
@click.command()
.— Декларативное описание аргументов и опций.
— Автоматический парсинг аргументов командной строки.
— Генерация
help
сообщения.— Поддержка
bash
/zsh
автодополнения.— Вложенные команды и группы подкоманд.
— Цветной вывод в терминал.
Click
широко используется для создания консольных утилит, CLI интерфейсов для web фреймворков, DevOps инструментов, скриптов автоматизации и других задач, где требуется командная строка.Библиотека Typer
Она позволяет легко создавать CLI приложения с поддержкой аргументов, опций, субкоманд и автоматической генерацией
Основные возможности
— Декоратор
— Автоматический парсинг аргументов и опций.
— Валидация и tipped annotations для аргументов и опций.
— Автоматическая генерация
— Встроенная поддержка
Typer часто используется для создания утилит командной строки, CLI интерфейсов для python приложений, API клиентов, DevOps инструментов и других задач, где нужен простой и удобный интерфейс командной строки.
Typer
— это библиотека для создания командных интерфейсов приложений на Python. Она позволяет легко создавать CLI приложения с поддержкой аргументов, опций, субкоманд и автоматической генерацией
help
. Основные возможности
Typer
:— Декоратор
@typer.command()
для определения команд и подкоманд.— Автоматический парсинг аргументов и опций.
— Валидация и tipped annotations для аргументов и опций.
— Автоматическая генерация
help
с описаниями.— Встроенная поддержка
Click
для обратной совместимости.Typer часто используется для создания утилит командной строки, CLI интерфейсов для python приложений, API клиентов, DevOps инструментов и других задач, где нужен простой и удобный интерфейс командной строки.
#вопросы_с_собеседований
Что такое коллизия?
Коллизия — это ситуация, когда при добавлении элементов в хеш-таблицу или словарь, разные ключи отображаются в одну и ту же ячейку памяти.
Это происходит потому, что количество возможных ключей обычно больше, чем размер выделенной хеш-таблицы, и хеш-функция отображает ключи в ограниченное количество ячеек.
При коллизии несколько разных ключей могут иметь одинаковый хеш, что приводит к их конфликту при размещении в хеш-таблице.
Чтобы решить проблему коллизий, в Python используются разные стратегии, например:
— Цепочки: списки элементов внутри ячейки таблицы.
— Открытая адресация: подбор следующей свободной ячейки.
— Перехеширование: генерация нового хеша при коллизии.
Уменьшение коллизий позволяет повысить производительность операций с хеш-таблицами и словарями.
Что такое коллизия?
Это происходит потому, что количество возможных ключей обычно больше, чем размер выделенной хеш-таблицы, и хеш-функция отображает ключи в ограниченное количество ячеек.
При коллизии несколько разных ключей могут иметь одинаковый хеш, что приводит к их конфликту при размещении в хеш-таблице.
Чтобы решить проблему коллизий, в Python используются разные стратегии, например:
— Цепочки: списки элементов внутри ячейки таблицы.
— Открытая адресация: подбор следующей свободной ячейки.
— Перехеширование: генерация нового хеша при коллизии.
Уменьшение коллизий позволяет повысить производительность операций с хеш-таблицами и словарями.
Точка входа в программу
Конструкция if __name__ == '__main__' используется для того, чтобы определить, запущен ли файл модуля напрямую или импортирован из другого модуля.
Эта конструкция позволяет запустить какой-то код только при прямом вызове модуля, так как name будет равно 'main' только если модуль запущен напрямую.
Это позволяет запускать программу полностью только когда она основная, а не импортируется в качестве модуля.
#это_база
Конструкция if __name__ == '__main__' используется для того, чтобы определить, запущен ли файл модуля напрямую или импортирован из другого модуля.
Эта конструкция позволяет запустить какой-то код только при прямом вызове модуля, так как name будет равно 'main' только если модуль запущен напрямую.
Это позволяет запускать программу полностью только когда она основная, а не импортируется в качестве модуля.
#это_база
#вопросы_с_собеседований
В каких случаях можно обработать SyntaxError?
SyntaxError — это исключение, которое генерируется интерпретатором при обнаружении ошибки в синтаксисе кода.
Обработать это исключение можно в следующих случаях:
— При разборе и выполнении кода, сгенерированного пользователем в приложении (например, в песочнице).
— При динамическом изменении и выполнении кода с помощью eval() или exec().
— В REPL оболочках для обработки ошибок в интерактивном режиме.
— В инструментах для проверки и валидации кода на корректность синтаксиса.
— В интерпретаторах и компиляторах для информирования пользователя об ошибке.
— В системах автодополнения кода для обработки некорректного синтаксиса.
— В средствах отладки и трассировки для выявления ошибок в выполняемом коде.
В каких случаях можно обработать SyntaxError?
Обработать это исключение можно в следующих случаях:
— При разборе и выполнении кода, сгенерированного пользователем в приложении (например, в песочнице).
— При динамическом изменении и выполнении кода с помощью eval() или exec().
— В REPL оболочках для обработки ошибок в интерактивном режиме.
— В инструментах для проверки и валидации кода на корректность синтаксиса.
— В интерпретаторах и компиляторах для информирования пользователя об ошибке.
— В системах автодополнения кода для обработки некорректного синтаксиса.
— В средствах отладки и трассировки для выявления ошибок в выполняемом коде.