允许整数索引或索引迭代器的正确python方法?

允许整数索引或索引迭代器的正确python方法?,python,iterator,Python,Iterator,什么是允许整数索引或索引迭代器的正确python方法 我为正在进行的项目实现了一个网格小部件,我意识到我希望用户能够同时选择多个行/列。但是,我不希望要求它们使用迭代器来指示单个行/列选择 下面是我正在使用的一些演示代码,但感觉不是正确的解决方案: def toIter ( selection ): if selection is None: return [] elif isinstance ( selection, int ): return

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

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

下面是我正在使用的一些演示代码,但感觉不是正确的解决方案:

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应该能够做到这一点,但它抱怨integer和NoneType不可移植:

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

您可能只想在小部件类中重写,并支持整数和切片。大概是这样的:

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]
那样访问

Numpy有一些你可能会觉得有用的漂亮东西,还有很多你不知道你需要的东西。听起来你可能有一个矩阵。:)我搜索了这个问题的答案,每个人都说担心类型是不合适的,他们从来没有真正回答过这个问题,所以我希望一个具体的例子可以得到更好的结果,或者至少可以更好地解释这种方法的错误。@Two Bitalchest谢谢,是的,这是一个矩阵,但我的理解是numby只处理数字,我实际上需要将对象存储在2d数组中,因为我有内容、前景色、背景色、字体等属性,etcI只是输入了几乎相同的答案。如果你想要一些语法上的甜点,你可以定义一个范围类来实现gettem,并从Widget中的Range属性返回,可能还需要一个对Widget的引用来完成工作。这是一个好主意,但是有没有比所有这些isinstance更好的方法呢?从某种角度讲,这是一种干净的pythonic,它实现了我的toIter()函数基本上要做的事情?