я не понимаю, зачем такая хрень сделана для сортировки списка. вообще, как новичку в питоне, язык мне кажется непоследовательным. есть какие-то правила, и в каждом правиле в питоне исключения и нелогичности.
Of course, the code must be complete enough to compile and link.
Раньше sort принимал функцию, сравнивающую два элемента (cmp : a, b -> -1|0|1), а теперь выдающую ключ для сортировки. Вот для совместимости с старыми программами, вы бы какую из них выбрали в качестве первого аргумента без имени? (Правильного ответа нет, в любом случае какой-то код сломается)
Конечно, если б сейчас заново переписать весь проект, всё было бы иначе. Многие вещи сохранены или изменены для обратной совместимости. Это бич всех больших, долго поддерживаемых проектов. Лично на мой взгляд, было бы правильно не сохранять совместимость тогда когда что-то нужно поменять. И программы написанные для Python 2.6 не работали бы в 2.5 и 2.7. И всё нормально, потому что одновременно с этим нет никакой необходимости переходить на 2.7 (хотя почему-то многие считают, что непременно нужно). Но команда CPython считает иначе. Вы пользуетесь результатами их многолетнего труда бесплатно. Можете предложить решение лучше (и вполне вероятно, что его примут и вы всем сделаете хорошо) или использовать то, что есть.
T>Это правда.
T>Раньше sort принимал функцию, сравнивающую два элемента (cmp : a, b -> -1|0|1), а теперь выдающую ключ для сортировки. Вот для совместимости с старыми программами, вы бы какую из них выбрали в качестве первого аргумента без имени? (Правильного ответа нет, в любом случае какой-то код сломается)
Мне непоследовательным кажется то, что list.sort использует что-то, чего в простом виде в самом питоне нет (нет синтаксической конструкции): получив такое сообщение (TypeError, keyword argument), я сначала подумал, что новый синтаксис keyword only argument позволяет такое сделать, но нет.
Я бы сделал проще — без этого сообщения странного. Пользователь и так получил бы исключение — key принимает один параметр, а — cmp — два (хотя, конечно, можно все попортить дефолтными аргументами).
T>Конечно, если б сейчас заново переписать весь проект, всё было бы иначе. Многие вещи сохранены или изменены для обратной совместимости. Это бич всех больших, долго поддерживаемых проектов. Лично на мой взгляд, было бы правильно не сохранять совместимость тогда когда что-то нужно поменять. И программы написанные для Python 2.6 не работали бы в 2.5 и 2.7. И всё нормально, потому что одновременно с этим нет никакой необходимости переходить на 2.7 (хотя почему-то многие считают, что непременно нужно). Но команда CPython считает иначе. Вы пользуетесь результатами их многолетнего труда бесплатно.
>Можете предложить решение лучше (и вполне вероятно, что его примут и вы всем сделаете хорошо) или использовать то, что есть.
либо сделать, чтобы новый синтаксис keyword-only аргументов приводил в случае нарушения к такому исключению всегда, либо никогда, а не в каком-то одном частном случае.
Of course, the code must be complete enough to compile and link.
>>Можете предложить решение лучше (и вполне вероятно, что его примут и вы всем сделаете хорошо) или использовать то, что есть. L_L>либо сделать, чтобы новый синтаксис keyword-only аргументов приводил в случае нарушения к такому исключению всегда, либо никогда, а не в каком-то одном частном случае.
T>>Отлично, предложение у вас уже есть (быстро кстати, это здорово). Осталось только озвучить его нужным людям. http://mail.python.org/mailman/listinfo/python-dev
L_L>ну похожего поведения все же можно добиться, хоть и сообщение не совсем такое.
L_L>
T>>Вы пробовали это запускать? У меня в 2.6 это SyntaxError. (hint: все non-* arguments должны идти до *args) L_L>Да, конечно. Python 3.1.2.
Хорошо, у меня сейчас нет возможности посмотреть какое там будет сообщение. (да и не сказать чтоб было очень интересно)
В любом случае, предложения по улучшению питона рассматриваются не в этом форуме. По крайней мере так чтоб эффект был. А поболтать, конечно — другое дело.
T>В любом случае, предложения по улучшению питона рассматриваются не в этом форуме. По крайней мере так чтоб эффект был. А поболтать, конечно — другое дело.
Ок. На самом деле, предложений у меня не было — бегло глянув Пеп и попробовав пример, в котором был дефолтный аргумент, я не получил желаемого поведения (похожего на сорт встроенного списка), потому и спросил здесь. А дальше, получив ответ — "никак" — я не сдержался и высказал свою досаду Извините, что потратил ваше время.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
T>>Это правда.
L_L>Мне непоследовательным кажется то, что list.sort использует что-то, чего в простом виде в самом питоне нет (нет синтаксической конструкции)
В list.sort это тоже не "в простом виде" сделано, а через проверку типа и конструирование исключения.
if (Py_SIZE(args) > 0) {
PyErr_SetString(PyExc_TypeError,
"must use keyword argument for key function");
return NULL;
}
Никто не запрещает и Вам в Ваших функция заниматься тем же самым (пример был приведен выше Temoto), на то он и динамический язык. И совершенно ничего "сложного", кстати, в этом нет, наоборот так гораздо проще, имхо, чем с введением дополнительных синтаксических конструкций на каждый возможный выверт контрактов функций.
E> Никто не запрещает и Вам в Ваших функция заниматься тем же самым (пример был приведен выше Temoto), на то он и динамический язык. И совершенно ничего "сложного", кстати, в этом нет, наоборот так гораздо проще, имхо, чем с введением дополнительных синтаксических конструкций на каждый возможный выверт контрактов функций.
А кстати, зачем эту проверку сделали в лист.сорт? Чтобы при портировании кода с 2.х на 3.х сообщения об ошибках были более понятными?
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>А кстати, зачем эту проверку сделали в лист.сорт? Чтобы при портировании кода с 2.х на 3.х сообщения об ошибках были более понятными?
Да.
вот тут подробнее о мотивах изменения контракта фуркции list.sort