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