在Python中的_getitem__方法中使用关键字参数
我想定义一个类Foo,它的对象可以像,在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[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