Работа со структурированными данными - 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
В основе этого лежит "инженерная грамотность": зачем писать код, который стандартная библиотека может надежно сгенерировать сама?