gpt4 book ai didi

python - 当 >64 位时从 __len__() 返回

转载 作者:太空狗 更新时间:2023-10-29 17:31:37 25 4
gpt4 key购买 nike

在这个问题中,我处理的是 IPv6 网络地址空间,所以长度是 2^(128-subnet)

看起来 python(至少在这台机器上)最多可以处理 64 位有符号数作为 __len__() 的返回值。所以 len(IP('2001::/66')) 有效,但 len(IP('2001::/65')) 失败。

from IPy import IP
len(IP('2001::/64'))
Traceback (most recent call last):
File "test.py", line 2, in <module>
len(IP('2001::/64'))
OverflowError: long int too large to convert to int

有问题的 IPy 库位于 https://github.com/haypo/python-ipy .

关于如何处理此问题的任何建议,或暗示这可能是我遇到的限制?

最佳答案

您遇到的问题是 Python 的 C API 对容器的长度有系统相关的限制。也就是说,C 函数 PyObject_Size 返回一个 Py_ssize_t 值,这是标准 C size_t 类型的签名版本。它的大小取决于系统,但在 32 位系统上可能是 32 位,在 64 位系统上可能是 64 位。

内置的len函数使用了PyObject_Size,所以它也有同样的限制。这是 its current implementation :

static PyObject *
builtin_len(PyObject *self, PyObject *v)
{
Py_ssize_t res;

res = PyObject_Size(v);
if (res < 0 && PyErr_Occurred())
return NULL;
return PyInt_FromSsize_t(res);
}

您可以通过在 IP 对象上使用 len 方法来解决此限制,而不是调用内置的 len:

IP('2001::/64').len()

这是纯 python,所以它对整数大小没有任何限制。

关于python - 当 >64 位时从 __len__() 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15650878/

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