适当的pythonic方式允许整数索引或索引的迭代器?

时间:2015-03-19 20:17:56

标签: python iterator

允许整数索引或索引迭代器的正确pythonic方法是什么?

我已经为我正在进行的项目实现了一个网格小部件,我意识到我希望我的用户能够同时选择多个行/列。但是,我不希望它们使用迭代器来指示单行/列选择。

下面是我工作的一些演示代码,但它并不是一个合适的解决方案:

def toIter ( selection ):
    if selection is None:
        return []
    elif isinstance ( selection, int ):
        return (selection,)
    else:
        return selection

def test ( selection ):
    for col in toIter(selection):
        print(col) # this is where I would act on the selection

test ( None )
test ( 7 ) # user can indicate a specific column selected...
test ( range(3,7) ) # or a tuple/range/list/etc of columns...

编辑:添加了使用无表示没有选择的能力......

第二次编辑:我真的认为python应该能够做到这一点,但它抱怨整数和NoneType不可迭代:

def test ( selection ):
    for col in selection:
        print(col)

1 个答案:

答案 0 :(得分:1)

您可能只想覆盖窗口小部件类中的__getitem__,并支持整数和切片。像这样:

class Widget(object):
    def __getitem__(self, selection):
        if isinstance(selection, int):
            #return selected col
        elif isinstance(selection, slice):
            #return cols based on selection.start/stop/step
        else:
            raise TypeError('bad selection')

然后您可以使用:

w = Widget()
w[4] # get 4th col
w[8:16] # get 8-16th cols

您还可以对此进行增强,以通过切片元组支持二维访问,可以像w[1:4, 5:8]一样访问。