Python eq: сравнение объекта с диапазоном допустимых значений

Напишите решение на Python и проверьте его на странице.

Другие упражнения по этой теме: Сравнение и хеширование Python: задачи на eq, lt и set.

Допуски калибровочного стенда

На автоматизированном калибровочном стенде детали сопоставляются с эталонными шаблонами допусков. Шаблон задаёт замкнутый диапазон допустимых размеров от минимального до максимального значения, включая случай вырожденного интервала с совпадающими границами, а деталь обладает фиксированным точным размером.

Объекты деталей умеют напрямую сравниваться только друг с другом по величине размера. При попытке применить операторы < или > к шаблону или объекту любого другого постороннего типа деталь возвращает NotImplemented, передавая право сравнения второму участнику проверки.

В свою очередь, шаблон допуска сопоставляется как с другими шаблонами — по ширине их диапазона, — так и с деталями через механизм отражённых вызовов. Деталь считается строго меньше шаблона, только если её размер строго меньше левой границы интервала, и строго больше шаблона, только если её размер строго превосходит правую границу. Если же размер детали оказывается внутри диапазона или совпадает с любой из его границ, оба строгих неравенства дают отрицательный ответ.

Реализуйте классы детали и шаблона с однозначным поведением операторов < и > на границах допуска и корректной работой отражённых вызовов через NotImplemented.

Что уже дано

В редакторе объявлены заготовки классов Part и Tolerance с методами __init__, __lt__ и __gt__, тела которых вам предстоит написать.

Вспомогательная функция observe_tolerance_comparisons доступна в среде во время проверки, реализовывать её самостоятельно не нужно.

Что нужно сделать

Реализуйте классы Part и Tolerance:

  1. Класс Part(size):
  • сохраняет переданный размер в атрибуте экземпляра .size;
  • реализует прямые методы __lt__ и __gt__ для сравнения с другими объектами Part (а также их подклассами) по значению size;
  • для операндов любого другого типа (включая Tolerance и его подклассы) оба метода должны возвращать синглтон NotImplemented.
  1. Класс Tolerance(min_size, max_size):
  • сохраняет границы диапазона в атрибутах .min_size и .max_size (гарантируется, что min_size <= max_size);
  • при сравнении с другим объектом Tolerance (или его подклассом) операторы < и > сравнивают ширину диапазонов (max_size - min_size);
  • при сравнении с объектом Part (или его подклассом) реализует отражённые вызовы так, чтобы выражение part < template давало True тогда и только тогда, когда part.size < template.min_size, а part > template — когда part.size > template.max_size;
  • если размер детали лежит внутри замкнутого интервала [min_size, max_size] либо совпадает с любой из границ (в том числе для вырожденного интервала с нулевой шириной), оба строгих неравенства дают False;
  • для любых посторонних типов, не относящихся к семействам Tolerance или Part, методы Tolerance возвращают NotImplemented.

Все числовые параметры представляют собой целые числа в диапазоне от -1 000 000 до 1 000 000, а количество проверяемых пар сравнений в одном запуске составляет от 0 до 1000. Никаких правил полного порядка, равенства (__eq__), хеширования (__hash__) или сортировки реализовывать не требуется.

Ввод и вывод

Стандартные потоки ввода stdin и вывода stdout в решении не используются: считывать ввод и вызывать print() не нужно. После выполнения кода учащегося проверяющая система считывает из пространства имён модуля классы верхнего уровня Part и Tolerance и вызывает их с проверочными аргументами.

Пример использования

part = Part(10)
template = Tolerance(10, 12)
print(part < template, part > template)
print(Part(8) < template, Part(13) > template)

Вывод:

False False
True True
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи