python - 如何在 IPython 中为自定义类的实例启用特定的选项卡完成功能?
问题描述
我正在创建一个自定义类,它dict
使用__init__
、__setitem__
、__delitem__
和update
作为该自定义类的函数继承。在 jupyter 笔记本中创建该类的实例时,我想在点访问此实例的属性时完成制表符:
some_instance = Foo()
some_instance. # pressing tab should only show 'update'
并且dir()
会打印
dir(some_instance)
# output: ['update']
除了简单地解释做什么之外,官方文档并没有太大帮助__dir__
,自定义 dict 类的 ipython 选项卡完成并没有帮助我太多。
我不太确定它是如何工作的或它在做什么,但是将以下函数添加到类中正是我想要的:
def __dir__(self):
return ['update']
这是我到目前为止所拥有的:
# this file is located in some_lib
import json
def save(obj, name):
with open(name, 'w+') as file_:
json.dump(obj, file_)
def load(name):
with open(name, 'r') as file_:
return json.load(file_)
class BijectiveDict(dict):
"""
References
https://stackoverflow.com/questions/1456373/two-way-reverse-map
"""
def __init__(self, dict_={}):
assert isinstance(dict_, dict), "Argument Error: dict_ is not of type dict"
for key, val in dict_.items():
self.update(key, val)
def __setitem__(self, x, y):
# override how self[key] = value works since this class inherits Dict.
# this way, self.add can work as expected
# delete any old pairs that contain x or y
if x in self:
del self[x]
if y in self:
del self[y]
dict.__setitem__(self, x, y)
dict.__setitem__(self, y, x)
def __delitem__(self, key):
dict.__delitem__(self, self[key])
dict.__delitem__(self, key)
def __len__(self):
# returns number of unique mappings
return dict.__len__(self) // 2
def __dir__(self):
return ["update"]
def update(self, x, y):
self[x] = y
如果我有
import some_lib
some_map = some_lib.BijectiveDict()
some_map. # using dot access and pressing tab returns methods from the dict class
然后点访问具有以下制表符完成(如果__dir__
未定义):
['clear',
'copy',
'fromkeys',
'get',
'items',
'keys',
'pop',
'popitem',
'setdefault',
'test_name',
'update',
'values']
这样定义__dir__
是唯一的方法吗?如果我的班级将有一堆方法,而我忘记将其包含在 dir 返回的列表中,那我该怎么办?有自动的方法吗?
同样,为什么制表符完成 some_lib 显示json, save, load
?我还必须定义另一个__dir__
吗?
解决方案
推荐阅读
- postgresql - TimescaleDB:具有追加与中点插入和索引的超表的性能
- python - TypeError:“AxesSubplot”对象不可下标
- java - 使用 Frida 动态更改 Java 代码(Android)
- matlab - 如何在 MATLAB 表中将逻辑列转换为双精度列
- mysql - 子查询和公用表表达式
- javascript - 无法在javascrit中获得两个数字的总和
- python - 当我调用一个跳过链接列表中节点的函数时,为什么输出是一个空列表?
- java - 根据条件调用实现类
- android - 在我的自定义后端使用 Firebase ID 令牌进行身份验证的安全问题
- reactjs - 如何改变波形值three.js