在Python中,sequence _getitem _的原型定义是什么?
现在,我正在这样做:在Python中,sequence _getitem _的原型定义是什么?,python,python-3.x,python-3.4,Python,Python 3.x,Python 3.4,现在,我正在这样做: class EdgesGenerator(abc.Sequence): def __init__(self, link, size): self.link = link self.size = size def __getitem__(self, cluster_index): try: index = cluster_index.__index__() except
class EdgesGenerator(abc.Sequence):
def __init__(self, link, size):
self.link = link
self.size = size
def __getitem__(self, cluster_index):
try:
index = cluster_index.__index__()
except AttributeError:
raise TypeError from None
if 0 <= index < self.size:
return Edge(self.link, index)
raise IndexError
def __len__(self):
return self.size
class EdgesGenerator(abc.顺序):
定义初始化(自身、链接、大小):
self.link=link
self.size=大小
def uu getitem uu(自、群集索引):
尝试:
索引=群集索引。\索引\uuuuuu()
除属性错误外:
从“无”引发TypeError
如果0在注释中正确给出,那么我所知道的唯一标准模式是from
object.\uuuu获取项目(self,key)
调用以实现对self[key]
的评估。对于序列类型,接受的键应该是整数和切片对象。请注意,负索引的特殊解释(如果类希望模拟序列类型)取决于\uu getitem\uuu()
方法。如果键的类型不合适,可能会引发TypeError;如果某个值超出序列的索引集(在对负值进行任何特殊解释之后),则应引发IndexError。对于映射类型,如果缺少键(不在容器中),则应引发KeyError
但是我看到您的实现中还有另一个问题,对于\uuu getitem\uuu()
的每个有效调用,都是针对类似对象[index]
的东西。您每次都在创建一个新的边对象
因此,每次调用object[index]
,您都会收到一个新的Edge
对象(尽管该Edge对象的内容可能相同),但对象本身是新的
所以像-object[index]就是object[index]
这样的东西很可能会失败(结果为False)
除非这是您想要的,否则您应该尝试缓存边缘对象(如果找到,则从缓存返回)。我建议使用字典来缓存对象(因为您似乎是在动态创建对象,只有在访问时才创建对象),尽管您也可以使用列表,但您只需要初始化列表,使其大小为self.size
您所说的“原型”是什么意思?你应该如何写它取决于你想要它做什么;编写\uuu getitem\uuu
方法没有单一的方法。@kindall:我认为对于序列,应该遵循标准模式。例如,为超出范围的参数提高IndexError和为非整数参数提高TypeError与列表
一致。我是否缺少其他类型的一致性?如果序列上的\uuu getitem\uuu
引发属性错误,那会很奇怪,不是吗?请参阅@CristianCiupitu:Aha的文档…不确定我为什么不先检查它!那么我没事了?还有,你用的是什么版本的python?是的,没错。我认为对于多个调用,对象标识不需要相同。它只是用于构建UI句柄,所以我不想创建和缓存所有可能的边缘对象。我希望他们在飞行中创建。否则,我就不需要这个抽象对象。是的,但我是说你可以缓存动态创建的对象。是的,但这不能节省边缘对象占用的内存的一小部分,因为对于每个被阻止分配的对象,都会有其他对象指向它。如果您改变缓存的想法,您可以使用缓存,也可以使用WeakValueDictionary
将索引映射到Edge
对象<代码>对象[索引]是对象[索引]
将保持不变。但只要没有对给定的边缘的引用,它就会被GCed。