在Python中的_getitem__方法中使用关键字参数

在Python中的_getitem__方法中使用关键字参数,python,metaprogramming,Python,Metaprogramming,我想定义一个类Foo,它的对象可以像,Foo[1,a=2]那样使用 我试图通过装饰 但是没有成功。下面是示例代码 def decorator(func): def func_(*args, **kewargs): if 'a' in kewargs: args = list(args) + [kewargs['a']] return func(*args) else: return f

我想定义一个类Foo,它的对象可以像,
Foo[1,a=2]
那样使用

我试图通过装饰 但是没有成功。下面是示例代码

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.\uu getitem\uuuuuu(…)
之类的东西 幕后是为前者做的。我的问题是到底是什么以及如何做到
我可以让
foo[2,a=10]
工作吗,如果可以的话。

Python允许隐式元组创建(不带括号):

它在方括号内的工作原理相同:

In [4]: d = {(1, 2, 3): 4}

In [5]: d[1, 2, 3]
Out[5]: 4
但是
(2,a=10)
不是有效的元组文字:

In [6]: (2, a=10)
  File "<ipython-input-1-7dc03602f595>", line 1
    (2, a=10)
         ^
SyntaxError: invalid syntax
[6]中的
:(2,a=10)
文件“”,第1行
(2,a=10)
^
SyntaxError:无效语法
简单地说,您无法使
foo[2,a=10]
正常工作,因为无论您如何调整
\uuu getitem\uuu
实现,这都是一个语法错误

我可能会定义一个普通的方法,例如
get
,并像
Foo.get(2,a=10)
一样使用它,这是为Python3.6提出的 使用关键字参数进行索引当前是一个语法错误

然而,PEP472()建议将此添加到python语法中

权变措施 政治公众人物还显示了当前有效的变通方法:


foo[2,a:10]
foo[2,{a:10}]

您希望
foo[2,a=10]
做什么?我们可以告诉您,这种语法永远不会起作用,但如果不知道目标,我们就不能提出任何可能的建议。请注意,
\uuu getitem\uuu
始终(我认为…)获取两个参数:
self
,以及调用时使用的方括号的内容。这样做是不可能的,在subscription@jonrsharpe:我想打电话给foo。[…]允许关键字args更方便。……我在上面的注释我想在“[]”将其参数转换为tuple之前截取它,这是我试图用decorator做的,但没有成功。@Tima正如我所说,decorator(或任何东西)不会帮你避免语法错误。您的代码甚至没有执行的机会。不过,政治公众人物认为第一个解决方法是esotheric。它使用slice对象而不是dictionary(比如在本例中询问
“a”
10
之间的范围)。将切片对象解析为dict可能非常模糊,并且您可能会失去对切片对象其他用法的支持
foo[2,{“a”:10}]
可能是最接近OP需要的选项。
In [6]: (2, a=10)
  File "<ipython-input-1-7dc03602f595>", line 1
    (2, a=10)
         ^
SyntaxError: invalid syntax