gpt4 book ai didi

python - 为什么对于整数而不是 float ,ndigits=None 上的 round 加注?

转载 作者:太空宇宙 更新时间:2023-11-03 10:57:20 25 4
gpt4 key购买 nike

ndigits 明确设置为 None 时,为什么 round() 对 int 和 float 的行为不同?

Python 3.5.1 中的控制台测试:

>>> round(1, None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object cannot be interpreted as an integer
>>> round(1.0, None)
1

更新:

我将此报告为错误 (Issue #27936),该错误已修复并关闭。@PadraicCunningham 和@CraigBurgler 是正确的。

此修复包含在以下最终版本中:

最佳答案

来自 3.5floatobjects.cfloat_round 的源代码:

float_round(PyObject *v, PyObject *args)
...
if (!PyArg_ParseTuple(args, "|O", &o_ndigits))
return NULL;
...
if (o_ndigits == NULL || o_ndigits == Py_None) {
/* single-argument round or with None ndigits:
* round to nearest integer */
...

|| o_ndigits == Py_None 位显式捕获 ndigits=None 参数并将其丢弃,将对 round 的调用视为单参数调用。

3.4 中,这段代码如下所示:

float_round(PyObject *v, PyObject *args)
...
if (!PyArg_ParseTuple(args, "|O", &o_ndigits))
return NULL;
...
if (o_ndigits == NULL) {
/* single-argument round: round to nearest integer */
...

没有|| o_ndigits == Py_None 测试,因此 ndgits=None 参数失败并被视为 int,从而导致 TypeError对于 3.4 中的 round(1.0, None)

3.4longobject.c 中的 long_round 中都没有检查 o_ndigits == Py_None3.5,因此在 3.43.5< 中都为 round(1, None) 引发了 TypeError/

                treat ndigits=None as      resolve
Version/Type single-argument call round(n, None)
---------- --------------- -----------
3.4/float No TypeError
3.4/long No TypeError
3.5/float Yes round(n)
3.5/long No TypeError

关于python - 为什么对于整数而不是 float ,ndigits=None 上的 round 加注?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39274173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com