Есть ли возможность в 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]
аналогично тому, как вы можете отличить foo((1,2))
от foo(1,2)
.
Не легко. Хотя источник по-разному обозначается, код в конечном итоге разбирается одинаково:
>>> 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()))])"
Есть два способа, которые я могу придумать, чтобы обнаружить разницу, и безумную:
Связанный с этим вопрос, связанный с грамматикой: когда требуются круглые скобки вокруг кортежа?
x = 1,2
иy = (1,2)
и тогда вы увидите, что они одинаковы. Чтобы сделать это, вам нужно сделать серьезный анализ кода, и это не имеет никакого смысла. Почему вы хотите выделить их в первую очередь?,
которая делает кортеж, скобки на самом деле бесполезны.1,2
соответствует(1,2)
. Это просто более читабельно. Обратите внимание, что вы можете различать[1, 2]
и[[1,2]]
.