> 64位时从__len __()返回

Jef*_*and 13 python ipv6 long-integer

在这个问题上,我正在处理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
Run Code Online (Sandbox Code Playgroud)

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

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

Blc*_*ght 13

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

内置len函数使用PyObject_Size,因此它具有相同的限制.这是它目前的实施:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

IP('2001::/64').len()
Run Code Online (Sandbox Code Playgroud)

这是纯python,因此它对整数大小没有任何限制.