Ключ завершения табуляции для __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__. Я не понимал, что Pythondicts уже делают это так же, как Pandas DataFrames.

Другие вопросы по тегам