首页 > 解决方案 > 如何在 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__吗?

标签: pythonpython-3.xdirectoryjupyter-notebookmagic-methods

解决方案


推荐阅读