首页 > 解决方案 > ipython 或 jupyter 中的制表符完成是为了建议替代方案而寻求什么?

问题描述

我很困惑为什么这个例子:

import attr

@attr.s
class SomeClass(object):
    a_number = attr.ib(default=42)

b = SomeClass(7)

在此处输入时提供a_number作为唯一选择tab

b.<tab>

但在这个例子中:

from attrdict import AttrDict
a = AttrDict(dict(a_number=7))  # Edited. was anumber originally

提供了多种选择,但a_number不是其中之一:

a.<tab>

可以以某种方式更改第二个示例以允许ipython显示a_number为属性吗?

在每种情况下,a.a_number计算b.a_number结果为 7。因此它们每个都表现得好像它们具有一个a_number属性。

标签: pythonipythonjupyter-notebookjupyter-lab

解决方案


ipython通过使用名为dir. 对于一个对象,dir意味着返回对象的属性、对象的类和类基的属性。默认情况下,dir(obj)如果它以下划线开头,它还会排除结果中的任何条目,除非您首先键入下划线。但是,一旦你开始搞乱__getattribute__and __getattr__dir可能就再也找不到所有有效的属性了。这是因为您正在使用 Python 获取属性的机器,而dir不是无所不知的机器。

在您的第一个示例anumber中,是该类的一个属性,因此dir通常会报告。

在您使用的第二个示例AttrDict中,它确实__getattr__. 事实上,它几乎完全委托给__getitem__. 因此,您的 dict 的所有键似乎也可用作属性。但是,它并没有实现__dir__,因此 的默认实现dir并没有意识到 an 的键AttrDict应该在 的返回值中报告dir。因此,ipython不知道这些属性是否可用。

如果您子类AttrDict化,您可以让自动完成功能再次工作。例如。

class MyAttrDict(AttrDict):
   def __dir__(self):
       super_dir = super().__dir__()
       string_keys = [key for key in self if type(key) is str]
       return super_dir + [key for key in string_keys if key not in super_dir]

>>> obj = MyAttrDict(something='value')
>>> obj.some<tab>
>>> obj.something

推荐阅读