添加建议到python会话自动完成,这些建议也出现在IPython笔记本中



我正在尝试将定制的建议添加到交互式python选项卡自动完成中。我在互联网上找到了这个玩具示例

import readline, rlcompleter
addrs = ['angela@domain.com', 'michael@domain.com', 'david@test.com']
class mycompleter(rlcompleter.Completer):
    def completer(self, text, state):
        options = [x for x in addrs if x.startswith(text)]
        try:
            return options[state]
        except IndexError:
            return None
readline.set_completer(mycompleter().completer)
readline.parse_and_bind("tab: complete")

如果我将其保存在模块中并且他们导入它,这在 python 中效果非常好。如果我使用 %paste 魔术将其粘贴到活动会话中,它也可以在 IPython 中工作。

但是,我无法通过加载模块或在单元格中运行它来让它在 IPython 笔记本中工作。我找到了有关其对readline模块扩展的 ipython 文档,但这并没有帮助。我尝试从IPCompleter对象继承,并使用rlcompete方法等,但这似乎没有帮助。

关于如何以在普通python和IPython笔记本中工作的方式将内容添加到自动完成建议中的任何建议

谢谢尼尔

更新:最终,我正在寻找一种向模块添加功能的方法,以便它可以动态更新会话自动完成列表(理想情况下,对于一组特定函数的 args,这样它就不会污染建议(。

有一种方法可以做到这一点,这不是推荐的,但有效。

def my_matches(test):
    # might want to be smarter here
    return ['angela@domain.com', 'michael@domain.com', 'david@test.com']
ip = get_ipython()
ip.Completer.matchers.append(my_matches)
# it works

方法需要设置钩子,但我没有使用过它并且很旧并且可以重构

最新更新