Как Python сравнивает функции? - PullRequest
25 голосов
/ 30 октября 2011

Почему так не возникает ошибка атрибута? Функциональный объект не имеет методов сравнения. Использует ли он каким-либо образом 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__ и т. Д.

Ответы [ 2 ]

23 голосов
/ 30 октября 2011

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

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

В Python 3 функции больше не могут быть заказаны.

10 голосов
/ 30 октября 2011

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

Справочник по языку Python говорит:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...