13

在这个问题中,我处理的是 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

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

4

1 回答 1

13

您遇到的问题是 Python 的 C API 对容器的长度有系统相关的限制。也就是说,C 函数PyObject_Size返回一个Py_ssize_t值,它是标准 Csize_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);
}

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

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

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

于 2013-03-27T03:12:48.640 回答