python - 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
属性。
解决方案
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
推荐阅读
- javascript - 根据共享点中是/否(复选框)字段的值启用或禁用字段
- javascript - 这个三元运算符表达式的等价物是什么?
- javascript - 从嵌套在对象属性中的数组中提取数据
- c++ - 调用 aruco::detectMarkers crash 时 Opencv 停止
- gulp - 寻找一个 Gulp 插件,它将根据特定的标题属性跳过降价文件
- solr - Solr 8.5.2 的 Mysql 驱动程序而不是 hsql 驱动程序
- c - libssl.so.1.0.0:未定义符号:EVP_idea_cbc
- python-3.x - 如果列表的元素存在于python数据框的列中,请提取它们?
- python - 这是什么错误?这是一个数字助理
- jbpm - jbpm 7 +oracle 12+ tomcat processInstanceByteArray 为空