- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在这个问题中,我处理的是 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/
根据文档,这不起作用,因为: For custom classes, implicit invocations of special methods are only guaranteed to wo
我是编程初学者,目前正在上 Python 类(class)。我正在使用 PyCharm,并且正在编写一个函数来合并字典。我将参数的数量设置为变量,并希望存储调用函数时实际传递的参数数量作为要在 whi
我似乎无法让我的 len 功能正常工作,我一直在尝试很多东西,但我是一个完全的初学者,所以我很确定我错过了一些完全明显的东西。这是我的代码... def __len__(self): if
我正在编写一个简单的链表实现如下: class Node(object): def __init__(self, value): self.value = value
基本上,我想要一个生成器在每个时期重新读取魔术方法 _len__ 以重新计算该时期将完成多少批次。 下面是一段代码: import tensorflow as tf import numpy as n
我想创建一个自定义元素序列。当迭代它时,序列的长度被忽略。这是一个最小的代码示例: class Test(): def __init__(self): pass def
我要实现一些容器对象。 class A: def __init__(self, L): self.L = list(L) def __len__(self):
给定这个相对简单的 tk 脚本: import Tkinter class buttton(Tkinter.Button): def __init__(self,frame,action=No
我正在编写一个充当不可变、无限序列的 python 类。 该类不使用生成器来访问这个无限序列,而是根据 __getitem__ 方法中的算法为序列中的任意索引生成一个值。 我很好奇处理此类对象的 __
以前可以设置内部函数,如 __len__()在运行时。下面是一个例子: #! /usr/bin/python3 import sys class FakeSequence: def __ini
出于我的目的,我创建了一个保留对象的类。 该对象的实际长度是 float ,而不是整数。可能有 2 个对象的差异 - 比如说 0.00001,最短的对我来说是最好的。 为了方便起见,我在类中定义了一个
在这里,我开始创建一个带有文本字段的 TK 窗口,但是当我运行它时,我收到错误 Exception in Tkinter callback Traceback (most recent call la
class Foo: def __getitem__(self, item): print('getitem', item) if item == 6:
调用 len([1,2,3]) 或 [1,2,3].__len__() 有什么区别吗? 如果没有明显的区别,那么在幕后做了什么不同的事情? 最佳答案 len 是一个获取集合长度的函数。它通过调用对象的
我想让 AI 玩我的自定义环境,不幸的是,当我运行我的代码时,出现以下错误: File "C:\Program Files\JetBrains\PyCharm Community Edition
我对 python 很陌生,我一直在玩 Tkinter 和 requests尝试创建一个可以登录到我的 Web 应用程序的简单程序。我一直收到以下错误: Exception in Tkinter ca
我想在 python 中原生实现一个不可变类型。我从这里收集的 How to make an immutable object in Python? 最好的方法是覆盖元组。假设我想要一个存储一些额外数
如何删除此对象中的 __size 属性? class Object(): def __init__(self, size): self.__size = size de
我不熟悉 python 的方法,我在这里看到了一些其他类似描述的问题,但无法解决这个问题。 错误: Traceback (most recent call last): File "C:/Users/
为什么会有人使用双下划线 为什么不直接执行 len([1,2,3])? 我的问题具体是下划线是什么意思? 最佳答案 __len__() 是使用 len() 时调用的特殊 Python 方法。 这很像
我是一名优秀的程序员,十分优秀!