2013-07-25 3 views
2

Один из моих сотрудников использовал встроенную функцию max (на Python 2.7), и он обнаружил странное поведение.Python любопытство: []> lambda n: n

по ошибке, вместо того, чтобы использовать аргумент ключевое слово ключ (как в key=lambda n: n) для предварительной сортировки списка, переданного в качестве параметра, он сделал:

>>> max([1,2,3,3], lambda n : n) 
[1, 2, 3, 3] 

Он делал то, что в документации поясняется как:

Если предусмотрено два или более позиционных аргумента, возвращается наибольший из аргументов positional., так что теперь мне интересно, почему это происходит:

>>> (lambda n:n) < [] 
True 
>>> def hello(): 
...  pass 
... 
>>> hello < [] 
True 
>>> len(hello) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: object of type 'function' has no len() 

Я знаю, что это не имеет большого значения, но я был бы признателен, если какой-либо из stackoverflowers может объяснить, как эти сравнения внутренне сделаны (или назовите меня в направлении, где я могу найти эту информацию). :-)

Заранее спасибо!

+0

Как вы перешли от 'lambda n: n' к решению сравнить с объектами функции? :) –

+1

@Jon Clements: ну ... просто делаю тесты ... так как лямбда - это функция, я начал делать странные тесты с функциями **: D ** (о, и я сделал waaaay больше, чем те, которые я опубликовал здесь) – BorrajaX

ответ

7

Python 2 заказывает объекты разных типов довольно произвольно. Он сделал это, чтобы делать списки всегда сортировать, независимо от содержимого. Какое направление, в котором происходит сравнение, действительно не имеет значения, просто он всегда выигрывает. Как это бывает, C implementation возвращается к сравнению имен типов; lambda 's имя типа function, который сортирует перед list.

В Python 3, код должен вызвать исключение вместо:

>>> (lambda n: n) < [] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unorderable types: function() < list() 

, потому что, как вы выяснили, поддерживая произвольные сравнения в основном приводит к труднодоступной трещине ошибкам.

+0

Да, мы пробовали на Python 3, и мы видели исключение ... Просто интересно, почему Python 2.7 имел такое поведение :) – BorrajaX

6

Все в Python (2) можно сравнить, но некоторые из них довольно бессмысленны, как вы видели.

>>> (lambda n:n) < [] 
True 

Python 3 разрешает это и вместо этого производит исключения.

Смежные вопросы