将Python切片语法传递给函数

ely*_*ely 15 python syntax slice

在Python中,是否可以完全封装常见的切片语法并传递它?我知道我可以使用slice__slice__模拟切片.但是我希望传递完全相同的语法,我将放在方括号中使用__getitem__.

例如,假设我编写了一个函数来返回列表的某些片段.

def get_important_values(some_list, some_condition, slice):
    elems = filter(some_condition, some_list)
    return elems[slice]
Run Code Online (Sandbox Code Playgroud)

如果我手动传入切片对象,这可以正常工作:

In [233]: get_important_values([1,2,3,4], lambda x: (x%2) == 0, slice(0, None))
Out[233]: [2, 4]
Run Code Online (Sandbox Code Playgroud)

但是我想让用户传递的内容与他们使用的切片完全相同__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:) )
Run Code Online (Sandbox Code Playgroud)

显然这会产生语法错误.但有没有办法让这项工作,而不是为x:y:t类型切片编写我自己的迷你解析器,并强制用户将它们作为字符串传递?

动机

我可以让这个示例函数返回一些可直接切片的东西,例如filter(some_condition, some_list),这将是作为列表的整个结果.然而,在我的实际例子中,内部函数要复杂得多,如果我知道用户想要的切片,我可以大大简化计算.但是我希望用户不必多做额外的事情就可以提前告诉我切片.

NPE*_*NPE 12

也许以下几行中的内容对您有用:

class SliceMaker(object):
  def __getitem__(self, item):
    return item

make_slice = SliceMaker()

print make_slice[3]
print make_slice[0:]
print make_slice[:-1]
print make_slice[1:10:2,...]
Run Code Online (Sandbox Code Playgroud)

我们的想法是您使用make_slice[]而不是手动创建实例slice.通过这样做,您将能够在其所有荣耀中使用熟悉的方括号语法.

  • 请注意,NumPy内置为`np.s_`:http://docs.scipy.org/doc/numpy/reference/generated/numpy.s_.html (14认同)