【问题标题】:Why is there different behaviour from getpwuid and getgrgid?为什么 getpwuid 和 getgrgid 有不同的行为?
【发布时间】: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 的行为似乎更有帮助,奇怪的是它不适用于这两个函数。这是getgrgidgetpwuid 中的不良行为吗?

【问题讨论】:

  • 这是个好问题。我认为它可能会在one of the official Python mailing lists 上得到更正式的答案。这样做最终可能会导致对两个模块之一进行修补。核心python代码开发的邮件列表是python-dev(核心开发人员都在那里,包括Guido)。
  • 好计划。发布后,我在bugs.python.org/issue26129 提出了一个“行为”类问题,但你说得对,我应该询问 python-dev 列表。
  • 如果我是你,我会为pwd 写一个行为更轻松的补丁并将其附加到票证上。如果修补后的代码已经准备好合并,则更有可能发生更改。此外,我怀疑他们是否会对grp 更加严格,因为可能已经存在依赖于宽松行为的代码。您可能还应该使用补丁添加回归测试(对于 pwdgrp 模块)。
  • 按照bugs.python.org/issue26129,开发人员认为getgrgid 的行为是不可取的,它将在下一个版本中被弃用。
  • 在阅读了他们关于错误报告的理由后,我同意他们的看法。 Python 是一种强类型语言;让它表现得像其他任何事情一样只会导致问题。

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


【解决方案1】:

简短的回答是因为人类容易犯错并且会发生错误。有些是dooziesget noticed quickly,有些是次要的,可以多年不被发现。

感谢您帮助 Python 变得更好!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 2012-07-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2020-04-27
    相关资源
    最近更新 更多