Python 3中是否有可能使项目查找Foo [(1,2)]和Foo [1,2]变得不明显?自
class Foo:
def __getitem__(self, key):
print(type(key), key)
foo = Foo()
foo[(1,2)]
foo[1,2]
两者都产生相同的输出。
<class 'tuple'> (1, 2)
编辑:为什么要这样:我有一组“参数化”的类,我想为这些类建立工厂。例如__call__(*arg)
实例化具有从*arg
推断出的参数的类,而__getitem__
返回具有通过键传递的参数的类。
我希望可以像__getitem__
那样使用__call__
,以便于您区分foo[(1,2)]
和foo[1,2]
,类似于区分{{1} },来自foo((1,2))
。
答案 0 :(得分:4)
不容易。尽管源tokenized有所不同,但最终还是以相同的方式解析了代码:
>>> import ast
>>> ast.dump(ast.parse('foo[(1,2)]')) == ast.dump(ast.parse('foo[1,2]'))
True
>>> ast.dump(ast.parse('foo[(1,2)]'))
"Module(body=[Expr(value=Subscript(value=Name(id='foo', ctx=Load()), slice=Index(value=Tuple(elts=[Num(n=1), Num(n=2)], ctx=Load())), ctx=Load()))])"
我可以想到两种方法来检测差异,两者都是疯狂的: