在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
(或者对于足够旧的Python,使用PyNumber_Int
)作为转换。正如文档在https://docs.python.org/3/c-api/number.html中所述,这相当于运行int(o)
,它可以将字符串转换为整数。然后才通过一个辅助函数_Py_Gid_Converter
将其传递给PyNumber_Index
这种差异的原因是什么?这是否是基于某些历史选择的故意决定?
getgrgid
的行为似乎更有用,很奇怪它不应用于两个函数。这是getgrgid
或getpwuid
中不需要的行为吗?
pwd
编写一个更放松的行为补丁,并将其附加到票证上。如果已经准备好合并的代码,则更有可能被更改。此外,我怀疑他们不会使grp
更加严格,因为可能已经有依赖于放松行为的代码存在。你应该为补丁添加回归测试(对于pwd
和grp
模块都要添加)。 - eestradagetgrgid
的行为不可取,并将在下一个版本中弃用。 - Simon Fraser