ipython或jupyter中的tab completion寻求什么来建议替代方案?

ipython或jupyter中的tab completion寻求什么来建议替代方案?,python,ipython,jupyter-notebook,jupyter-lab,Python,Ipython,Jupyter Notebook,Jupyter Lab,我对这个例子感到困惑: import attr @attr.s class SomeClass(object): a_number = attr.ib(default=42) b = SomeClass(7) from attrdict import AttrDict a = AttrDict(dict(a_number=7)) # Edited. was anumber originally 在此处输入tab时,提供a_编号作为唯一选项: b.<tab> 提供了

我对这个例子感到困惑:

import attr

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

b = SomeClass(7)
from attrdict import AttrDict
a = AttrDict(dict(a_number=7))  # Edited. was anumber originally
在此处输入
tab
时,提供
a_编号
作为唯一选项:

b.<tab>
提供了多种选择,但编号不在其中:

a.<tab>
a。
第二个示例能否以某种方式进行更改,以允许
ipython
a_编号
显示为属性


在每种情况下,
a.a_编号
b.a_编号
计算为7。因此,它们的行为似乎都有一个
a_number
属性。

ipython
通过使用名为
dir
的python内置代码执行自动完成。对于对象,
dir
用于返回对象、对象类和类基的属性。默认情况下,如果
dir(obj)
结果中的任何条目以下划线开头,则它也会排除该条目,除非您首先键入了下划线。但是,一旦您开始处理
\uuuuu getattribute\uuuuu
\uuuuu getattr\uuuuu
目录可能无法再找到所有有效的属性。这是因为您正在使用Python获取属性的机制,而
dir
并不是无所不知的

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

在第二个示例中,您使用了
AttrDict
,它确实与
\uuu getattr\uuu
有冲突。事实上,它几乎完全委托给
\uu getitem\uu
。因此,dict中的所有键似乎都可以作为属性使用。但是,它没有实现
\uuuu dir\uuuu
,因此
dir
的默认实现没有意识到
属性的键应该在
dir
的返回值中报告。因此,
ipython
不知道这些属性是否可用

如果您将AttrDict子类化为
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
类MyAttrDict(AttrDict):
定义目录(自我):
super\u dir=super()
string_keys=[如果类型(key)为str,则key for key in self]
返回super_dir+[如果键不在super_dir中,则为字符串中的键返回键]
>>>obj=MyAttrDict(something='value')
>>>一些
>>>什么

不错!如果与一个键相关的值是一个dict的列表,那么它不起作用,但是您的答案告诉了我需要知道的内容。