Я Python автозаполнение вызывает __getattr__ - PullRequest
1 голос
/ 04 мая 2020

спасибо, что нашли время, чтобы прочитать это. Надеюсь, что в эти странные времена все в порядке.

Я реализую класс и начал искать, как обеспечить автозаполнение его атрибутов. Из моих онлайн-исследований я пришел к выводу, что i python пополнение происходит из __dir__ метода.

__getattr__ обычно вызывается при доступе к атрибуту, который не существует. В моем проекте, если это произойдет, выполняется операция, которая занимает некоторое время. Почему я python пытаюсь получить доступ к атрибутам, а не просто отображать то, что вернул __dir__?

В ячейке 2 я нажимаю клавишу табуляции после точки, чтобы попросить завершения.

enter image description here

1 Ответ

1 голос
/ 04 мая 2020

Я думаю, проблема в том, что вам нужен экземпляр вашего класса. Эти методы являются методами экземпляра.

Я добавил ведение журнала для упрощения отладки. Я получаю вывод в консоли ipython, когда я example.something или example.<tab>.

  • Python версия 3.8.2
  • I Python версия 7.14.0

Это мое наблюдение: вызывается <tab> __dir__ и возвращенная коллекция предметов отображается в консоли I Python. Если элемент, выбранный после <tab>, не является атрибутом объекта, то __getattr__ вызывается в попытке найти его.

import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)


class Example:
    def __init__(self):
        logging.info("init")
        self._attrs = ("foo", "bar", "baz")
        for attr in self._attrs:
            setattr(self, attr, attr)

    def __getattr__(self, attr):
        logging.info(f"__getattr__ called: {attr}")

    def __dir__(self):
        logging.info("__dir__ called")
        return ("extra", *self._attrs)


# Create an instance of Example.
# The instance methods can then be called on the instance.
example = Example()

if __name__ == "__main__":
    logging.info(example)

enter image description here

...