【发布时间】:2012-11-22 06:38:44
【问题描述】:
在 Python 中,是否可以完全封装常见的切片语法并传递它?我知道我可以使用slice 或__slice__ 来模拟切片。但我想传递与__getitem__ 一起使用的方括号中完全相同的语法。
例如,假设我编写了一个函数来返回列表的某个片段。
def get_important_values(some_list, some_condition, slice):
elems = filter(some_condition, some_list)
return elems[slice]
如果我手动传入一个切片对象,这会很好:
In [233]: get_important_values([1,2,3,4], lambda x: (x%2) == 0, slice(0, None))
Out[233]: [2, 4]
但我想让用户通过的是完全他们将使用__getitem__ 的相同切片:
get_important_values([1,2,3,4], lambda x: (x%2) == 0, (0:-1) )
# or
get_important_values([1,2,3,4], lambda x: (x%2) == 0, (0:) )
显然这会产生语法错误。但是有没有什么办法可以让这个工作,而不是为x:y:t 类型切片编写我自己的迷你解析器,并强制用户将它们作为字符串传递?
动机
我可以让这个示例函数返回直接可切片的内容,例如filter(some_condition, some_list),这将是一个列表的整个结果。然而在我的实际例子中,内部函数要复杂得多,如果我提前知道用户想要的切片,我可以大大简化计算。但我希望用户不必做太多额外工作来提前告诉我切片。
【问题讨论】:
-
你写
__getattr__的地方我猜你的意思是__getitem__。 -
是的,对不起。我将在上面进行编辑以修复它。
-
如果 Python 有“切片文字”这样的东西,那就太酷了。我不认为破解该语言会太难,但我想这样的建议会被拒绝,因为几乎没有必要。
-
对于
numpy用户,还有一个答案here 使用numpy.s_。 -
是否有为此被拒绝的 PEP?我发誓有,但我现在找不到。