【发布时间】:2015-08-10 09:58:42
【问题描述】:
我想定义一个类 Foo,它的对象可以像 foo[1, a=2] 这样使用。
我试图通过装饰__getitem__ 方法来实现这一点
Foo但没有成功。下面是示例代码。
def decorator(func):
def func_(*args, **kewargs):
if 'a' in kewargs:
args = list(args) + [kewargs['a']]
return func(*args)
else:
return func(*args)
return func_
class Foo(object):
@decorator
def __getitem__(self, *items):
return items
foo = Foo()
>>> foo.__getitem__(2, a=10)
(2, 10)
>>> foo[2, a=10]
SyntaxError: invalid syntax
所以foo[...] 不等于foo.__getitem__(...),有些东西
幕后是为前者做的。我的问题是究竟是什么以及如何
我可以让foo[2, a=10] 工作吗?
【问题讨论】:
-
你想让
foo[2, a=10]做什么,到底是什么?我们可以告诉您,该语法永远不会起作用,但在不知道目标的情况下,我们无法提出任何建议。请注意,__getitem__总是(我认为...)有两个参数:self,以及调用时使用的方括号的内容。 -
那不行,订阅中不能有关键字参数
-
@jonrsharpe:我想通过允许关键字 args 使调用 foo.[...] 更加方便。
-
...我上面的评论代表