Ключ завершения табуляции для __getitem__ в классе Python
Я реализую класс Python, который содержит 2d массив Numpy (self.data
), что я настроил для доступа к столбцу с ключом строки. Ключи содержатся в dict, который отображает имена на индексы столбцов (например, self.coldict={'col0':0,...,'colN':N}
) и я определил
def __getitem__(self,key):
if isinstance(key,str):
return self.data[:,self.coldict[key]]
elif isinstance(key,int):
return self.data[:,key]
Это работает как предназначено для извлечения столбца.
Я хотел бы иметь возможность использовать клавишу табуляции для ключа, чтобы я мог набрать myObject['c+TAB
во время сессии iPython, чтобы получить варианты завершения.
Я думаю, что решение должно опираться на readline или prompt_toolkit, но мне не ясно, как реализовать завершающую функцию без переопределения уже активной функциональности в iPython.
Буду признателен за любую оказанную помощь. Спасибо!
1 ответ
Я не уверен, если вы можете завершить строку для табуляции __getitem__
, Завершение вкладки обычно для атрибутов объекта. Для завершения вкладки используются элементы, определенные в __dict__
словарь экземпляра и __dir__(self)
метод.
Если вы хотите завершить вкладку для доступа к атрибуту, вы можете.
class MyArray:
...
def __dir__(self):
return super().__dir__() + list(self.coldict.keys())
def __getattr__(self, name):
if name in self.coldict:
return self.data[:,self.coldict[name]]
return super().__getattr__(name)
Затем вы получите доступ к вашей колонке с
arr = MyArray() # My numpy array
print(arr.col0) # col0 should allow for tab complete.
Это было сложно отследить, но вот как это делается (ссылки 1 и 2):
Вы также можете настроить завершение клавиш для своих объектов, например, нажав табуляцию после
obj["a
. Для этого определите метод_ipython_key_completions_()
, который возвращает список объектов, которые являются возможными ключами в нижнем выраженииobj[key]
.
Я получил это, просто добавив метод под названием _ipython_key_completions_
в настраиваемый класс, который возвращает все возможные строковые ключи, которые можно использовать при вызове __getitem__
. Я не понимал, что Pythondict
s уже делают это так же, как Pandas DataFrames.