Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Python

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

Давайте сначала рассмотрим очень простой пример:

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)

Пара замечаний:

Далее давайте рассмотрим наиболее важные функции, которые этот пакет предлагает по сравнению с обычными классами данных:средства проверки и преобразователи.

Пример проверки атрибутов Python

Вы можете добавить валидаторы в свой класс данных attrs двумя способами:

  1. Использование декоратора
  2. Предоставив вызываемую функцию

Сначала я продемонстрирую метод вызываемой функции. 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

  1. Типы данных Python
  2. Функция Python String strip() с ПРИМЕРОМ
  3. Количество строк Python() с ПРИМЕРАМИ
  4. Функция Python round() с ПРИМЕРАМИ
  5. Функция Python map() с ПРИМЕРАМИ
  6. Python Timeit() с примерами
  7. Счетчик Python в коллекциях с примером
  8. Python time.sleep():добавьте задержку в свой код (пример)
  9. Счетчик списка Python() с ПРИМЕРАМИ
  10. Индекс списка Python() с примером