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)
您可以通过len在IP对象上使用该方法来解决此限制,而不是调用内置len:
IP('2001::/64').len()
Run Code Online (Sandbox Code Playgroud)
这是纯python,因此它对整数大小没有任何限制.
| 归档时间: |
|
| 查看次数: |
975 次 |
| 最近记录: |