周围路过的Python切片语法功能(Passing Python slice syntax arou

2019-07-04 12:18发布

在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)这将是整个结果的列表。 在我实际的例子,然而,内部功能要复杂得多,如果我知道,用户希望的时间提前片,我可以大大简化计算。 但我希望用户不必做太多多余的就提前告诉我的时间切片。

Answer 1:

或许大意如下的东西会为你工作:

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,...]

这个想法是,你使用make_slice[]而不是手动创建的实例slice 。 通过这样做,你就可以使用熟悉的方括号语法,其所有的荣耀。



Answer 2:

总之,没有。 这句法只有在上下文有效[]运营商。 我可能会建议接受元组作为输入,并然后传递该元组到slice() 或者,也许你可以重新设计你正在做什么,这样get_important_values()以某种方式作为可切片对象实现。

例如,你可以这样做:

class ImportantValueGetter(object):
    def __init__(self, some_list, some_condition):
        self.some_list = some_list
        self.some_condition = some_condition

    def __getitem__(self, key):
        # Here key could be an int or a slice; you can do some type checking if necessary
        return filter(self.some_condition, self.some_list)[key]

你也许可以做到通过把这个变成某种类型的容器ABC一个更好但这是一般的想法。



Answer 3:

单程(为简单切片)。将具有切片参数或者是一个字典或一个int,

get_important_values([1, 2, 3, 4], lambda x: (x%2) == 0, {0: -1})

要么

get_important_values([1, 2, 3, 4], lambda x: (x%2) == 0, 1)

那么语法会留下或多或少相同。

当你想要做这样的事情就不会工作,虽然,对于

some_list[0:6:10..]


文章来源: Passing Python slice syntax around to functions