Python Attrs:расширенные классы данных с примерами кода
Пакет Python Attrs позволяет создавать расширенные классы данных с помощью простых аннотаций. Конечно, в python также есть собственный собственный модуль класса данных, но пакет attrs для Python предлагает несколько дополнительных функций, которые могут вам понравиться!
Содержание
Установить атрибуты
Пакет attrs не является частью базовой библиотеки, поэтому вам нужно будет установить его с помощью команды pip install или чего-то подобного, например Pipenv. Возможно, вы также захотите создать виртуальную среду, чтобы она не мешала другим вашим проектам. Пакет называется attrs, поэтому его установка будет выглядеть так:
$ pip install attrs # or with pipenv: $ pipenv install attrs
Атрибуты и классы данных
Авторы attrs
фактически работали над PEP, который представил классы данных в Python. Собственные классы данных Python намеренно сделаны проще и понятнее, в то время как attrs предлагает полный спектр функций, которые могут вам понадобиться!
Некоторые причины выбрать Python attrs
над встроенными классами данных:
- Вы используете версию Python до 3.7. Attrs поможет вам, так как он поддерживает все основные версии Python, включая CPython 2.7 и PyPy.
- Вам нужны дополнительные функции:attrs предлагает валидаторы и конвертеры.
- Вы хотите добиться оптимальной производительности и минимального использования памяти, используя классы со слотами attrs
Базовый пример атрибутов Python
Давайте сначала рассмотрим очень простой пример:
import attr @attr.s class Person(object): name = attr.ib(default='John') surname = attr.ib(default='Doe') age = attr.ib(init=False) p = Person() print(p) p = Person('Bill', 'Gates') p.age = 60 print(p) # Output: # Person(name='John', surname='Doe', age=NOTHING) # Person(name='Bill', surname='Gates', age=60)
Пара замечаний:
- Синтаксис менее элегантный и более подробный, чем у классов данных, но взамен вы получаете дополнительные возможности.
- Подобно классам данных, вы получаете красиво отформатированное представление ваших данных при печати.
- Пакет attrs использует правильно подобранные имена, такие как
attr.ib
. , так что вам нужно только импортировать attr. Вы также можете импортировать полные имена. Например, сfrom attr import attrib, attrs
, и вместо этого используйте эти имена. Функционал такой же.
Далее давайте рассмотрим наиболее важные функции, которые этот пакет предлагает по сравнению с обычными классами данных:средства проверки и преобразователи.
Пример проверки атрибутов Python
Вы можете добавить валидаторы в свой класс данных attrs двумя способами:
- Использование декоратора
- Предоставив вызываемую функцию
Сначала я продемонстрирую метод вызываемой функции. Attrs предлагает несколько готовых валидаторов, из которых мы будем использовать instance_of
. валидатор в следующем примере:
>>> @attr.s ... class C(object): ... x = attr.ib(validator=attr.validators.instance_of(int)) >>> C(42) C(x=42) >>> C("a string") Traceback (most recent call last): ... TypeError: ("'x' must be <type 'int'> (got 'a string' that is a <type 'str'>).", ...
Поскольку мы попытались создать объект C со строковым значением для x, валидатор instance_of выдает ошибку, поскольку ему требуется тип int вместо строки.
Давайте теперь определим наш собственный валидатор:
import attr @attr.s class DividableByTwo(object): x = attr.ib() @x.validator def check(self, attribute, value): if value % 2 != 0: raise ValueError(f'{value} is not dividable by 2') print (DividableByTwo(60)) print (DividableByTwo(11)) # Output will be something like: # DividableByTwo(x=60) # ... # ValueError: 11 is not dividable by 2
Пример конвертера атрибутов Python
Преобразователь берет установленное значение и автоматически преобразует его. Вы можете использовать это для всех видов целей. Одним из примеров является автоматическое преобразование значения в тип int. Опять же, давайте начнем с использования вызываемой функции, в данном случае мы просто используем функцию Python int():
import attr @attr.s class C(object): x = attr.ib(converter=int) c = C("1") print(c) # Output: # C(x=1)
Наш ввод (строка «1») был автоматически преобразован в целое число. Поскольку преобразователи запускаются перед валидаторами, вы можете проверить окончательное значение после преобразования. Например, вы можете использовать приведенные выше два примера, чтобы сначала преобразовать любой ввод в int, а затем проверить, делится ли значение на два.
Использование слотов с атрибутами Python
Наконец, вы можете указать attrs использовать слотовые классы. Слотовые классы имеют некоторые преимущества перед обычными классами:
- Они занимают мало места в памяти.
- Они быстрее
Короче говоря, с классом со слотами вы явно указываете, какие атрибуты экземпляра вы ожидаете от своих экземпляров объекта. Таким образом, Python может пропустить некоторые проверки и тому подобное, что приведет к меньшему использованию памяти и небольшому увеличению скорости. Вы можете найти более подробную информацию в документации attrs здесь.
Однако слотовые классы тоже имеют оговорки, особенно когда вы создаете их вручную. К счастью, attrs предлагает простой способ включить эту функцию:
import attr @attr.s(slots=True) class YourClassName: ...
Продолжайте учиться
- Наша статья о классах данных Python
- Наше руководство по классам и объектам Python
- Дополнительные примеры см. на странице примеров атрибутов
Python
- Типы данных Python
- Функция Python String strip() с ПРИМЕРОМ
- Количество строк Python() с ПРИМЕРАМИ
- Функция Python round() с ПРИМЕРАМИ
- Функция Python map() с ПРИМЕРАМИ
- Python Timeit() с примерами
- Счетчик Python в коллекциях с примером
- Python time.sleep():добавьте задержку в свой код (пример)
- Счетчик списка Python() с ПРИМЕРАМИ
- Индекс списка Python() с примером