将Python切片语法传递给函数

将Python切片语法传递给函数,python,syntax,slice,Python,Syntax,Slice,在Python中,是否可以完全封装公共切片语法并将其传递?我知道我可以使用切片或切片来模拟切片。但我想传递的语法与我放在方括号中的语法完全相同,方括号将用于\uuuu getitem\uuuu 例如,假设我编写了一个函数来返回列表的某个部分 def get_important_values(some_list, some_condition, slice): elems = filter(some_condition, some_list) return elems[slice]

在Python中,是否可以完全封装公共切片语法并将其传递?我知道我可以使用
切片
切片
来模拟切片。但我想传递的语法与我放在方括号中的语法完全相同,方括号将用于
\uuuu getitem\uuuu

例如,假设我编写了一个函数来返回列表的某个部分

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]
但是我想让用户通过的是与
\uuu getitem\uuu
完全相同的切片:

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
类型片段编写自己的小型解析器,并强制用户将它们作为字符串传递

动机


我可以让这个示例函数直接返回一些可切片的内容,例如
过滤器(一些条件,一些列表)
,它将作为一个列表返回整个结果。然而,在我的实际例子中,内部函数要复杂得多,如果我提前知道用户想要的切片,我可以大大简化计算。但是我希望用户不必做太多额外的事情来提前告诉我片段。

简而言之,不。该语法仅在
[]
操作符的上下文中有效。我可能建议接受一个元组作为输入,然后将该元组传递给
slice()
。或者,您可以重新设计正在执行的任何操作,使
get\u important\u 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,您可能可以做得更好,但这是一般的想法。

一种方法(对于简单切片)是将切片参数设置为dict或int

然后,语法将或多或少保持不变

但是这不起作用,因为当你想做像

some_list[0:6:10..]

也许以下几点对你有用:

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
的实例。通过这样做,您将能够使用熟悉的方括号语法。您在哪里编写的
\uuuu getattr\uuuu
我想您的意思是
\uu getitem\uuuu
。是的,对不起。我将在上面进行编辑以修复它。如果Python有“切片文字”这样的东西,那将有点酷。我不认为侵入这种语言会太难,但我认为这样的建议会被拒绝,因为它基本上是不必要的。对于
numpy
用户,使用
numpy.s\uu
还有一个答案。是否有被拒绝的政治公众人物?我发誓有,但我现在找不到。我如何模拟
[]
的上下文?此外,元组也可以工作。但我不喜欢区分使用“无”来暗示(获取所有信息)和不使用该选项。如果
slice
获取关键字,可能会更好。另外,如果我只想
获取可直接切片的重要值,我会直接返回
过滤器(一些条件,一些列表)
,这将是作为列表的整个结果。在我的实际例子中,内部函数要复杂得多,如果我提前知道用户想要的切片,我可以大大简化计算。但是我希望用户不必做太多额外的事情来提前告诉我片段。在这个示例中,您仍然可以这样做。如果
切片
(使用
isinstance(键,切片),则在
\uu获取项目
然后,您可以访问切片对象的所有开始、停止和步骤属性,并在将其直接应用于筛选结果之前随意对其进行操作/优化。我同意您的看法,我可以这样做,这是一个有用的主题,在这种设计更适合的其他情况下需要记住。这是一个很好的Idea。这比传递切片的单个边界要干净得多。如果我不得不让用户稍微负担他们自己的切片输入,我认为这是迄今为止建议中侵入性最小的。请注意,NumPy有内置的
np.s\ucode>:
some_list[0:6:10..]
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,...]