Как сравнить функции python?

Почему это не поднимает ошибку атрибута? объект функции не имеет методов сравнения. Использует ли он id()?

fun1 = lambda:x
fun2 = lambda:x
print fun1 == fun1 # True
print fun1 == fun2 # False
print fun1 > fun2 # True
print fun1 < fun2 # False
print fun1 > 1 # True

Я понимаю, что он сравнивает адреса, но как? Это какой-то низкий уровень взлома для перехвата __lt__, __eq__ и т.д.?

Ответ 1

Объекты функций не определяют их собственные сравнения или богатые сравнения. Вместо этого они наследуют объекты которые реализуют богатые сравнения на основе адреса объекта в памяти.

Итак, да, он эффективно использует адреса, как это делает встроенная функция id().

В Python 3 функции больше не подлежат заказу.

Ответ 2

__eq__, __lt__ et al. не реализуйте сравнения в Python, они просто позволяют вам переопределить его.

Ссылка на язык Python гласит:

Большинство других объектов встроенных типов сравниваются неравномерно, если они не являются одним и тем же объектом; выбор того, считается ли один объект меньшим или большим, чем другой, делается произвольно, но последовательно в пределах одного выполнения программы.

Возможно, это делается путем сравнения идентификаторов объектов, но это не указано языком.

Я не уверен, в чем заключается обоснование того, что какой-либо объект сопоставим с любым другим объектом, но он является встроенной функцией языка - ссылка упоминает, что он делает любой сортируемый список, что делает определение сравнения двух словарей легче.