为什么getpwuid和getgrgid会有不同的行为?

Sim*_*ser 7 python cpython python-2.7 python-3.x

在Python 2.7,3.4和3.5中,grp.getgrgid能够接受一个字符串:

from grp import getgrgid
print(getgrgid('0'))
Run Code Online (Sandbox Code Playgroud)

但是,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
Run Code Online (Sandbox Code Playgroud)

这是因为在内部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,这是运行的等效int(o),可以将字符串转换为整数.只有这样才能PyNumber_Index通过辅助函数给予它_Py_Gid_Converter

造成这种差异的原因是什么?这是基于历史的故意选择吗?

这种行为getgrgid似乎更有帮助,奇怪的是它并不适用于这两种功能.在这种不良行为getgrgidgetpwuid

Eth*_*man 0

简而言之,因为人类是容易犯错的,并且错误会发生。有些很酷很快就会引起注意,有些是轻微的,可能会持续数年而不被发现。

感谢您帮助让 Python 变得更好!