【发布时间】:2016-04-21 11:49:45
【问题描述】:
在 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)首先作为转换,正如文档在https://docs.python.org/3/c-api/number.html 中所说,这相当于运行@ 987654340@,可以将字符串转换为整数。只有这样,它才会通过辅助函数_Py_Gid_Converter 提供给PyNumber_Index
造成这种差异的原因是什么?这是基于某些历史的深思熟虑的选择吗?
getgrgid 的行为似乎更有帮助,奇怪的是它不适用于这两个函数。这是getgrgid 或getpwuid 中的不良行为吗?
【问题讨论】:
-
这是个好问题。我认为它可能会在one of the official Python mailing lists 上得到更正式的答案。这样做最终可能会导致对两个模块之一进行修补。核心python代码开发的邮件列表是python-dev(核心开发人员都在那里,包括Guido)。
-
好计划。发布后,我在bugs.python.org/issue26129 提出了一个“行为”类问题,但你说得对,我应该询问 python-dev 列表。
-
按照bugs.python.org/issue26129,开发人员认为
getgrgid的行为是不可取的,它将在下一个版本中被弃用。 -
在阅读了他们关于错误报告的理由后,我同意他们的看法。 Python 是一种强类型语言;让它表现得像其他任何事情一样只会导致问题。
标签: python python-2.7 python-3.x cpython