Python3: в реализации __getitem__ отличают Foo [1,2] от Foo [(1,2)]

1

Есть ли возможность в 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).

  • 3
    Нет, они в точности эквивалентны. Посмотрите, что происходит: x = 1,2 и y = (1,2) и тогда вы увидите, что они одинаковы. Чтобы сделать это, вам нужно сделать серьезный анализ кода, и это не имеет никакого смысла. Почему вы хотите выделить их в первую очередь?
  • 0
    Это запятая , которая делает кортеж, скобки на самом деле бесполезны. 1,2 соответствует (1,2) . Это просто более читабельно. Обратите внимание, что вы можете различать [1, 2] и [[1,2]] .
Показать ещё 1 комментарий
Теги:
python-3.x

1 ответ

4
Лучший ответ

Не легко. Хотя источник по-разному обозначается, код в конечном итоге разбирается одинаково:

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

Есть два способа, которые я могу придумать, чтобы обнаружить разницу, и безумную:

Связанный с этим вопрос, связанный с грамматикой: когда требуются круглые скобки вокруг кортежа?

  • 0
    Я вижу, что это неудачно ... Я бы предпочел, чтобы getitem имел свойства simlar для вызова
  • 0
    Любой комментарий от downvoter?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню