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

时间:2016-01-15 19:41:18

标签: python python-2.7 python-3.x cpython

在Python 2.7,3.4和3.5中,grp.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)作为转换,并且文档在{{3这相当于运行int(o),它可以将字符串转换为整数。只有这样才能通过辅助函数PyNumber_Index

赋予_Py_Gid_Converter

这种差异的原因是什么?这是基于某些历史的刻意选择吗?

getgrgid的行为似乎更有帮助,奇怪的是它不适用于这两个函数。这是getgrgidgetpwuid中的不良行为吗?

1 个答案:

答案 0 :(得分:0)

简短的回答是因为人类容易犯错并且会发生错误。有些是dooziesget noticed quickly,有些是未成年人,可能会在未经检测的情况下持续数年。

感谢您帮助改进Python!