В 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
?
Это хороший вопрос. Я думаю, что он может получить более официальный ответ на [один из официальных списков рассылки Python] (https://www.python.org/community/lists/). Это может привести к тому, что один из двух модулей будет исправлен. Список рассылки для разработки основного кода питона - [python-dev] (https://mail.python.org/mailman/listinfo/python-dev) (основные разработчики находятся там, включая Guido). – eestrada
Хороший план. Я поднял проблему класса поведения на https://bugs.python.org/issue26129 сразу после публикации этого сообщения, но вы правы, что я должен спросить список python-dev. –
Если бы я был вами, я бы просто написал патч с более расслабленным поведением для '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