IPython自动完成功能正在调用__getattr __

时间:2020-05-04 16:31:04

标签: python python-3.x jupyter-notebook ipython

感谢您抽出宝贵的时间阅读本文。希望在这个陌生的时代一切都好。

我正在实现一个类,并开始研究如何在其属性上提供自动完成功能。 通过在线研究,我得出的结论是,ipython补全来自__dir__方法。

__getattr__通常在您访问不存在的属性时调用。在我的项目中,如果发生这种情况,则需要一段时间。为什么ipython尝试访问属性而不是仅显示返回的__dir__

在第2单元格中,我在点号后按Tab键以要求完成操作。

enter image description here

2 个答案:

答案 0 :(得分:1)

我认为问题在于您需要一个类的实例。这些方法是实例方法。

我添加了日志记录以便于调试。 ipythonexample.something时,我在example.<tab>控制台中得到输出。

  • Python版本3.8.2
  • IPython版本7.14.0

这是我的观察:在<tab>__dir__被调用,并且返回的项目集合显示在IPython控制台中。如果在<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

答案 1 :(得分:0)

所以我想出了一个解决方法。如果您知道需要较长时间的属性名称,则仅在传递该属性名称时执行自定义 getattr 代码,否则只会引发属性错误。这对我有用。