list.sort, keyword only arguments?
От: Lorenzo_LAMAS  
Дата: 16.09.10 14:44
Оценка:
Интересно, я получаю такое сообщение об ошибке:

lst = ['daba', 'Aba', 'Haba']
lst.sort(str.lower)#lst.sort(key=str.lower)


Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must use keyword argument for key function


Каким образом должна быть определена функция, чтобы интерпретатор выдал такое сообщение?
Of course, the code must be complete enough to compile and link.
Re: list.sort, keyword only arguments?
От: Temoto  
Дата: 16.09.10 15:05
Оценка: 8 (1) +1
L_L>Интересно, я получаю такое сообщение об ошибке:

L_L>
L_L>lst = ['daba', 'Aba', 'Haba']
L_L>lst.sort(str.lower)#lst.sort(key=str.lower)
L_L>


L_L>

L_L>Traceback (most recent call last):
L_L> File "<stdin>", line 1, in <module>
L_L>TypeError: must use keyword argument for key function


L_L>Каким образом должна быть определена функция, чтобы интерпретатор выдал такое сообщение?


Ну это же очевидно:

http://www.google.com/codesearch/p?hl=en#BhM2hRzY7ME/trunk/Python-2.6.4/Objects/listobject.c&amp;q=%5Elistsort%20lang:c%20package:cpython&amp;sa=N&amp;cd=1&amp;ct=rc&amp;l=2031

                if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOi:sort",
                        kwlist, &compare, &keyfunc, &reverse))
                        return NULL;



Если вас интересует, как определить такую функцию на питоне, то никак. Но можно сымитировать примерно так

def require_kwarg(kwargs, name, error_msg):
  try:
    return kwargs[name]
  except KeyError:
    raise TypeError(error_msg)


def list_sort(**kwargs):
  key = require_kwarg(kwargs, 'key', "must use keyword argument for key function")
  ...


Ну, хотя бы из boilerplate вроде очевидно, что лучше так не делать.
Re[2]: list.sort, keyword only arguments?
От: Lorenzo_LAMAS  
Дата: 16.09.10 17:53
Оценка: -1
L_L>>Каким образом должна быть определена функция, чтобы интерпретатор выдал такое сообщение?
T>Ну это же очевидно:
T>http://www.google.com/codesearch/p?hl=en#BhM2hRzY7ME/trunk/Python-2.6.4/Objects/listobject.c&amp;q=%5Elistsort%20lang:c%20package:cpython&amp;sa=N&amp;cd=1&amp;ct=rc&amp;l=2031
T>Если вас интересует, как определить такую функцию на питоне, то никак. Но можно сымитировать примерно так

я не понимаю, зачем такая хрень сделана для сортировки списка. вообще, как новичку в питоне, язык мне кажется непоследовательным. есть какие-то правила, и в каждом правиле в питоне исключения и нелогичности.
Of course, the code must be complete enough to compile and link.
Re[3]: list.sort, keyword only arguments?
От: Temoto  
Дата: 16.09.10 18:05
Оценка:
L_L>>>Каким образом должна быть определена функция, чтобы интерпретатор выдал такое сообщение?
T>>Ну это же очевидно:
T>>http://www.google.com/codesearch/p?hl=en#BhM2hRzY7ME/trunk/Python-2.6.4/Objects/listobject.c&amp;q=%5Elistsort%20lang:c%20package:cpython&amp;sa=N&amp;cd=1&amp;ct=rc&amp;l=2031
T>>Если вас интересует, как определить такую функцию на питоне, то никак. Но можно сымитировать примерно так

L_L>я не понимаю, зачем такая хрень сделана для сортировки списка. вообще, как новичку в питоне, язык мне кажется непоследовательным. есть какие-то правила, и в каждом правиле в питоне исключения и нелогичности.


Это правда.

Раньше sort принимал функцию, сравнивающую два элемента (cmp : a, b -> -1|0|1), а теперь выдающую ключ для сортировки. Вот для совместимости с старыми программами, вы бы какую из них выбрали в качестве первого аргумента без имени? (Правильного ответа нет, в любом случае какой-то код сломается)

Конечно, если б сейчас заново переписать весь проект, всё было бы иначе. Многие вещи сохранены или изменены для обратной совместимости. Это бич всех больших, долго поддерживаемых проектов. Лично на мой взгляд, было бы правильно не сохранять совместимость тогда когда что-то нужно поменять. И программы написанные для Python 2.6 не работали бы в 2.5 и 2.7. И всё нормально, потому что одновременно с этим нет никакой необходимости переходить на 2.7 (хотя почему-то многие считают, что непременно нужно). Но команда CPython считает иначе. Вы пользуетесь результатами их многолетнего труда бесплатно. Можете предложить решение лучше (и вполне вероятно, что его примут и вы всем сделаете хорошо) или использовать то, что есть.
Re[4]: list.sort, keyword only arguments?
От: Lorenzo_LAMAS  
Дата: 16.09.10 18:48
Оценка:
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.
Re[5]: list.sort, keyword only arguments?
От: Temoto  
Дата: 16.09.10 18:53
Оценка:
>>Можете предложить решение лучше (и вполне вероятно, что его примут и вы всем сделаете хорошо) или использовать то, что есть.
L_L>либо сделать, чтобы новый синтаксис keyword-only аргументов приводил в случае нарушения к такому исключению всегда, либо никогда, а не в каком-то одном частном случае.

Отлично, предложение у вас уже есть (быстро кстати, это здорово). Осталось только озвучить его нужным людям. http://mail.python.org/mailman/listinfo/python-dev
Re[6]: list.sort, keyword only arguments?
От: Lorenzo_LAMAS  
Дата: 16.09.10 19:20
Оценка:
T>Отлично, предложение у вас уже есть (быстро кстати, это здорово). Осталось только озвучить его нужным людям. http://mail.python.org/mailman/listinfo/python-dev

ну похожего поведения все же можно добиться, хоть и сообщение не совсем такое.

def fun(*laja, key):
    pass

fun(str.lower)
Of course, the code must be complete enough to compile and link.
p
Re[7]: list.sort, keyword only arguments?
От: Temoto  
Дата: 16.09.10 19:24
Оценка:
T>>Отлично, предложение у вас уже есть (быстро кстати, это здорово). Осталось только озвучить его нужным людям. http://mail.python.org/mailman/listinfo/python-dev

L_L>ну похожего поведения все же можно добиться, хоть и сообщение не совсем такое.


L_L>
L_L>def fun(*laja, key):
L_L>    pass

L_L>fun(str.lower)
L_L>


Вы пробовали это запускать? У меня в 2.6 это SyntaxError. (hint: все non-* arguments должны идти до *args)
Re[8]: list.sort, keyword only arguments?
От: Lorenzo_LAMAS  
Дата: 16.09.10 19:26
Оценка:
L_L>>
L_L>>def fun(*laja, key):
L_L>>    pass

L_L>>fun(str.lower)
L_L>>


T>Вы пробовали это запускать? У меня в 2.6 это SyntaxError. (hint: все non-* arguments должны идти до *args)

Да, конечно. Python 3.1.2.
Of course, the code must be complete enough to compile and link.
Re[9]: list.sort, keyword only arguments?
От: Temoto  
Дата: 16.09.10 19:46
Оценка:
T>>Вы пробовали это запускать? У меня в 2.6 это SyntaxError. (hint: все non-* arguments должны идти до *args)
L_L>Да, конечно. Python 3.1.2.

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

В любом случае, предложения по улучшению питона рассматриваются не в этом форуме. По крайней мере так чтоб эффект был. А поболтать, конечно — другое дело.
Re[10]: list.sort, keyword only arguments?
От: Lorenzo_LAMAS  
Дата: 16.09.10 20:25
Оценка:
T>В любом случае, предложения по улучшению питона рассматриваются не в этом форуме. По крайней мере так чтоб эффект был. А поболтать, конечно — другое дело.
Ок. На самом деле, предложений у меня не было — бегло глянув Пеп и попробовав пример, в котором был дефолтный аргумент, я не получил желаемого поведения (похожего на сорт встроенного списка), потому и спросил здесь. А дальше, получив ответ — "никак" — я не сдержался и высказал свою досаду Извините, что потратил ваше время.
Of course, the code must be complete enough to compile and link.
Re[5]: list.sort, keyword only arguments?
От: eugals Россия  
Дата: 17.09.10 06:37
Оценка:
Здравствуйте, 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), на то он и динамический язык. И совершенно ничего "сложного", кстати, в этом нет, наоборот так гораздо проще, имхо, чем с введением дополнительных синтаксических конструкций на каждый возможный выверт контрактов функций.
Re[6]: list.sort, keyword only arguments?
От: Lorenzo_LAMAS  
Дата: 17.09.10 08:25
Оценка:
E> Никто не запрещает и Вам в Ваших функция заниматься тем же самым (пример был приведен выше Temoto), на то он и динамический язык. И совершенно ничего "сложного", кстати, в этом нет, наоборот так гораздо проще, имхо, чем с введением дополнительных синтаксических конструкций на каждый возможный выверт контрактов функций.

А кстати, зачем эту проверку сделали в лист.сорт? Чтобы при портировании кода с 2.х на 3.х сообщения об ошибках были более понятными?
Of course, the code must be complete enough to compile and link.
Re[7]: list.sort, keyword only arguments?
От: eugals Россия  
Дата: 17.09.10 08:36
Оценка: 8 (1)
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>А кстати, зачем эту проверку сделали в лист.сорт? Чтобы при портировании кода с 2.х на 3.х сообщения об ошибках были более понятными?

Да.
вот тут подробнее о мотивах изменения контракта фуркции list.sort
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.