2016-01-15 4 views
7

В Python 2.7, 3.4 и 3.5, grp.getgrgid способен принимать строку:Почему существует отличное поведение от getpwuid и getgrgid?

from grp import getgrgid 
print(getgrgid('0')) 

Однако pwd.getpwuid не может делать то же самое:

from pwd import getpwuid 
print(getpwuid('0')) 

Traceback (most recent call last): 
    File "getpwuid_test.py", line 2, in <module> 
    print(getpwuid('0')) 
TypeError: an integer is required 

Это потому, что внутри Modules/pwdmodule.c, getpwuid применения PyNumber_ParseTuple с конвертером, который использует PyNumber_Index, чтобы получить целое число Python, и это вызывает исключение при сбое.

Однако в Modules/grpmodule.c, grp_getgrgid использует PyNumber_Long (Или PyNumber_Int для достаточно старой Python) как преобразование первой, и, как говорится в документации на https://docs.python.org/3/c-api/number.html, это эквивалентно запуску , который может преобразовать строку в целое число , Только после этого дается PyNumber_Index, с помощью вспомогательной функции _Py_Gid_Converter

В чем причина этой разницы? Это преднамеренный выбор, основанный на какой-то истории?

Поведение getgrgid кажется более полезным, и странно, что оно не применяется к обеим функциям. Является ли это нежелательным поведением в getgrgid или getpwuid?

+2

Это хороший вопрос. Я думаю, что он может получить более официальный ответ на [один из официальных списков рассылки Python] (https://www.python.org/community/lists/). Это может привести к тому, что один из двух модулей будет исправлен. Список рассылки для разработки основного кода питона - [python-dev] (https://mail.python.org/mailman/listinfo/python-dev) (основные разработчики находятся там, включая Guido). – eestrada

+2

Хороший план. Я поднял проблему класса поведения на https://bugs.python.org/issue26129 сразу после публикации этого сообщения, но вы правы, что я должен спросить список python-dev. –

+0

Если бы я был вами, я бы просто написал патч с более расслабленным поведением для 'pwd' и прикрепил его к билету. Скорее всего, это изменится, если исправленный код уже готов к слиянию. Кроме того, я сомневаюсь, что они сделают его более строгим для 'grp', поскольку, возможно, уже существует код в дикой природе, который зависит от расслабленного поведения. Вероятно, вы также должны добавить регрессионные тесты с патчем (как для '' pwd' '(https://hg.python.org/cpython/file/default/Lib/test/test_pwd.py), так и ['grp' ] (https://hg.python.org/cpython/file/default/Lib/test/test_grp.py). – eestrada

ответ

0

Короткий ответ заключается в том, что люди ошибаются и происходят ошибки. Некоторые из них - doozies и get noticed quickly, другие - незначительные и могут летать без обнаружения.

Спасибо, что помогли сделать Python лучше!

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