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

9
在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的行为似乎更有用,很奇怪它不应用于两个函数。这是getgrgidgetpwuid中不需要的行为吗?

2
这是一个好问题。我认为在Python官方邮件列表中可能会得到更正式的答案。这样做可能最终会导致其中一个模块被修补。用于开发核心Python代码的邮件列表是python-dev(核心开发人员都在那里,包括Guido)。 - eestrada
2
好计划。我在发布此帖后立即在https://bugs.python.org/issue26129上提出了“behavior”类问题,但您说得对,我应该向python-dev列表提问。 - Simon Fraser
如果我是你,我会为pwd编写一个更放松的行为补丁,并将其附加到票证上。如果已经准备好合并的代码,则更有可能被更改。此外,我怀疑他们不会使grp更加严格,因为可能已经有依赖于放松行为的代码存在。你应该为补丁添加回归测试(对于pwdgrp模块都要添加)。 - eestrada
2
根据 https://bugs.python.org/issue26129,开发人员决定 getgrgid 的行为不可取,并将在下一个版本中弃用。 - Simon Fraser
在阅读了他们对于这个错误报告的解释后,我同意他们的观点。Python 是一种强类型语言,让它表现得像其他语言只会在后续引发问题。 - eestrada
1个回答

0
简短的回答是因为人类会犯错,错误难免。有些错误非常严重并且会很快被发现,而有些则可能只是小问题,甚至可能数年都不会被察觉。
感谢您帮助使Python变得更好!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接