在询问this question之后,它收到了关于如何做这样的事情的评论:
>>> def a(n):
print(n)
return a
>>> b = a(3)(4)(5)
3
4
5
是否可以使用此概念或类似概念来索引my_list(n)
而不是my_list[n]
等列表?
答案 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