感谢您抽出宝贵的时间阅读本文。希望在这个陌生的时代一切都好。
我正在实现一个类,并开始研究如何在其属性上提供自动完成功能。
通过在线研究,我得出的结论是,ipython补全来自__dir__
方法。
__getattr__
通常在您访问不存在的属性时调用。在我的项目中,如果发生这种情况,则需要一段时间。为什么ipython尝试访问属性而不是仅显示返回的__dir__
?
在第2单元格中,我在点号后按Tab键以要求完成操作。
答案 0 :(得分:1)
我认为问题在于您需要一个类的实例。这些方法是实例方法。
我添加了日志记录以便于调试。 ipython
或example.something
时,我在example.<tab>
控制台中得到输出。
这是我的观察:在<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)
答案 1 :(得分:0)
所以我想出了一个解决方法。如果您知道需要较长时间的属性名称,则仅在传递该属性名称时执行自定义 getattr 代码,否则只会引发属性错误。这对我有用。