如何改变python列表索引的语法?

时间:2014-05-20 08:34:05

标签: python list python-3.x syntax indexing

在询问this question之后,它收到了关于如何做这样的事情的评论:

>>> def a(n):
        print(n)
        return a
>>> b = a(3)(4)(5)
3
4
5

是否可以使用此概念或类似概念来索引my_list(n)而不是my_list[n]等列表?

3 个答案:

答案 0 :(得分:5)

您必须使用自定义类,并为其设置__call__ special method以使其可调用。 list的子类在这里做得很好:

class CallableList(list):
    def __call__(self, item):
        return self[item]

您无法将此分配用于索引,但只有 access 项有效。切片需要您用来创建slice()对象:

a = CallableList([1, 2, 3])
a(2)
a(slice(None, 2, None))

nested = CallableList([1, 2, CallableList([4, 5, 6])])
nested(2)(-1)

除此之外,您还必须创建一个自定义Python语法解析器来构建AST,然后从那里编译为字节码。

答案 1 :(得分:0)

my_list()中的括号被视为函数调用。如果需要,您可以编写自己的类来包装列表并覆盖调用方法以索引到列表中。

class MyList(object):

    def __init__(self, alist):
        self._list = alist

    def __call__(self, index):
        return self._list[index]

>>> mylist = MyList(['a','b','c','d','e','f'])
>>> mylist(3)
'd'
>>> mylist(4)
'e'

答案 2 :(得分:0)

您可以创建一个返回lambda函数的函数:

def make_callable(some_list):
    return lambda x: some_list[x]

original_list = [ 1, 2, 3, 4 ]
callable_list = make_callable(original_list)

print(callable_list(1)) # Prints 2