Python3:在__getitem__实现中,将Foo [1,2]与Foo [(1,2)]区别开

时间:2018-09-20 15:31:26

标签: python python-3.x

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))

1 个答案:

答案 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()))])"

我可以想到两种方法来检测差异,两者都是疯狂的:

grammar相关的问题:When are parentheses required around a tuple?