Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,sequence _getitem _的原型定义是什么?_Python_Python 3.x_Python 3.4 - Fatal编程技术网

在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。