添加到IPython笔记本中出现的python会话自动完成的建议

时间:2014-12-15 14:13:37

标签: python autocomplete ipython ipython-notebook readline

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

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 magic将其粘贴到活动会话中,它也适用于IPython。

但是,我无法通过加载模块或在单元格中运行它来使其在IPython Notebook中工作。我找到了关于他们对{​​{1}}模块的扩展的ipython文档,但这没有帮助。我尝试继承readline个对象,并使用IPCompleter方法等,但这似乎没有帮助。

有关如何以普通python和IPython Notebook中的方式向自动填充建议添加内容的任何建议

由于 尼尔

更新 最后,我正在寻找一种向模块添加功能的方法,以便它可以动态更新会话自动完成列表(理想情况下是针对特定功能集的args,以便它不会污染建议)。

1 个答案:

答案 0 :(得分:0)

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

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

旧的方式需要设置挂钩,但我还没有使用它并且已经很老了 并且可以重构