ipv6 - > 64位时从 __len__() 返回

  显示原文与译文双语对照的内容
0 0

在这个问题中,我一直在和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国际极年

有何建议怎么处理这或暗示它可能是一个限制因素,我正在跟?

时间:原作者:5个回答

0 0

这个问题在想着另是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);
}

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

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

这是纯Python整数上,因此没有任何限制大小。

原作者:
...