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的列表,那么它不起作用,但是您的答案告诉了我需要知道的内容。