Работа со структурированными данными - 52AnTIMateria812/Plyer GitHub Wiki

Хотя plyer идеален для "железных" функций, в реальных приложениях необходимо обогащать логику встроенными инструментами Python. Для демонстрации сложных внутренних алгоритмов мы используем декоратор @total_ordering из модуля functools.

Класс DeviceInfo

Мы создали дата-класс-симулятор для сравнения устройств. Проблема: если мы хотим сортировать девайсы по уровню заряда или "мощности", нам пришлось бы вручную писать перегрузки операторов __eq__, __ne__, __lt__, __le__, __gt__, __ge__.

Используя @total_ordering, мы сокращаем объем бойлерплейт-кода в 3 раза:

from functools import total_ordering

@total_ordering
class DeviceInfo:
    def __init__(self, name, power, os_name):
        self.name = name
        self.power = power
    
    # Достаточно определить только логику равенства:
    def __eq__(self, other):
        if not isinstance(other, DeviceInfo): return NotImplemented
        return self.power == other.power

    # И логику оператора "Меньше":
    def __lt__(self, other):
        if not isinstance(other, DeviceInfo): return NotImplemented
        return self.power < other.power

В основе этого лежит "инженерная грамотность": зачем писать код, который стандартная библиотека может надежно сгенерировать сама?