Можно ли каким-то образом сделать так, чтобы [] в Python ассоциировались
не с листом, а с каким-либо другим классом?
Asked
Active
Viewed 1,203 times
2
jfs
- 52,361
Толкачёв Иван
- 609
- 2
- 12
- 25
-
1А можно поинтересоваться, зачем? – andreymal Sep 14 '17 at 14:13
-
Мне просто стало интересно, но я не смог нагуглить ответ) – Толкачёв Иван Sep 14 '17 at 14:28
-
Numpy и Pandas во всю этим пользуются... Поясните что вы хотите сделать. – MaxU - stand with Ukraine Sep 14 '17 at 19:02
2 Answers
2
Сделать так, чтобы [] вообще нельзя было применить к списку - нельзя. Сделать [] применимыми к объекту пользовательского класса - можно, причем совершенно не обязательно, чтобы скобки имели семантику индексации
class IsEven:
def __init__(self):
pass
def __getitem__(self, item):
return item % 2 == 0
x = IsEven()
print x[1], x[2] # --> False True
Если речь о том, чтобы вызов конструктора имел синтаксис генератора списков - нельзя.
andy.37
- 7,461
-
вопрос не о том как переопределить индексацию:
seq[index], а о том как сделать, чтобы[]вернули неlist(), а что-то другое. – jfs Sep 15 '17 at 05:36 -
"вопрос не о том как переопределить индексацию: seq[index], а о том как сделать, чтобы [] вернули не list(), а что-то другое" Сделай чтобы []== (). – Garry Galler Aug 27 '20 at 21:09
-
"вы не можете сказать, что это не Питон-код, что [] не переопределены" Квадратные скобки в Python нельзя переопределить из Python. – Garry Galler Aug 27 '20 at 21:13
2
Можно. К примеру, используя codetransformer пакет:
from codetransformer import CodeTransformer, instructions, pattern
class BuildSetFromList(CodeTransformer):
@pattern(instructions.BUILD_LIST)
def _build_set(self, _build_list):
yield instructions.LOAD_GLOBAL("set")
yield instructions.CALL_FUNCTION()
@BuildSetFromList()
def f():
return []
assert f() == set()
Вместо списка, [] создают set() здесь.
Есть ещё несколько других способов, см. начиная с "кодом Питона в разных представлениях можно манипулировать как простым объектом".
jfs
- 52,361
-
Ок, и теперь у нас
>>> type(f()) -> <class 'set'>но>>> type([]) -> <class 'list'>не уверен, что это называеться "можно". За либу спасибо, интересно – Igor Lavrynenko Sep 15 '17 at 08:08 -
@IgorSergeevich: (а) смотрим внутрь
f():return []видим квадратные скобки (возражений нет? согласны?). (б) Затем вызываемf()как вы уже сами призналиf() == set()(с) из(а)и(б)следует утвердительный ответ на вопрос "Можно ли переопределить квадратные скобки в Python?" (Питон код — ✓,[]— ✓, получили не список — ✓вывод: можно). Область действия в которой[]переопределено может варьироваться от выбранного способа, но сомнений нет, что[]переопределено (в примере, в вопросе внутри функцииf-- вы не можете сказать, что это не Питон-код, что[]не переопределены). – jfs Sep 16 '17 at 09:40