当前位置: 首页 > 面试题库 >

如何在python中编写自动补全代码?

翟黎明
2023-03-14
问题内容

我想在Linux终端中编写自动完成代码。该代码应按以下方式工作。

它具有字符串列表(例如,“ hello”,“ hi”,“你好”,“再见”,“很棒”等)。

在终端中,用户将开始输入内容,当有匹配的可能性时,他会提示可能的字符串,供他选择(类似于vim编辑器或google增量搜索)。

例如,他开始输入“ h”,他得到提示

你好”

_ “一世”

_“你好吗”

更好的是,它不仅可以从字符串的开头而且可以从字符串的任意部分完成单词。

谢谢你的指教。


问题答案:

(我知道这并不是您所要的,但是)如果您对自动TAB补全/建议(如许多shell中使用的)所出现的情况感到满意,则可以使用以下命令快速启动并运行在readline的模块。

这是一个基于Doug
Hellmann在readline
上的PyMOTW编写的快速示例。

import readline

class MyCompleter(object):  # Custom completer

    def __init__(self, options):
        self.options = sorted(options)

    def complete(self, text, state):
        if state == 0:  # on first trigger, build possible matches
            if text:  # cache matches (entries that start with entered text)
                self.matches = [s for s in self.options 
                                    if s and s.startswith(text)]
            else:  # no text entered, all matches possible
                self.matches = self.options[:]

        # return match indexed by state
        try: 
            return self.matches[state]
        except IndexError:
            return None

completer = MyCompleter(["hello", "hi", "how are you", "goodbye", "great"])
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')

input = raw_input("Input: ")
print "You entered", input

这将导致以下行为(<TAB>表示按下了Tab键):

Input: <TAB><TAB>
goodbye      great        hello        hi           how are you

Input: h<TAB><TAB>
hello        hi           how are you

Input: ho<TAB>ow are you

在最后一行(H``O``TAB输入的)中,只有一个可能的匹配项,并且整个句子“你好吗”是自动完成的。

请查看链接的文章,以获取有关的更多信息readline

“更好的情况是,它不仅可以从头开始完成单词,而且可以从字符串的任意部分完成单词。”

这可以通过在完成函数中简单地修改匹配条件来实现。从:

self.matches = [s for s in self.options 
                   if s and s.startswith(text)]

像这样:

self.matches = [s for s in self.options 
                   if text in s]

这将为您提供以下行为:

Input: <TAB><TAB>
goodbye      great        hello        hi           how are you

Input: o<TAB><TAB>
goodbye      hello        how are you

更新:使用历史记录缓冲区(如注释中所述)

创建用于滚动/搜索的伪菜单的简单方法是将关键字加载到历史记录缓冲区中。然后,您将可以使用向上/向下箭头键滚动浏览条目,也可以使用Ctrl+R进行反向搜索。

要尝试此操作,请进行以下更改:

keywords = ["hello", "hi", "how are you", "goodbye", "great"]
completer = MyCompleter(keywords)
readline.set_completer(completer.complete)
readline.parse_and_bind('tab: complete')
for kw in keywords:
    readline.add_history(kw)

input = raw_input("Input: ")
print "You entered", input

运行脚本时,请尝试输入Ctrl+,r然后输入a。这将返回包含“
a”的第一个匹配项。再次输入Ctrl+r以进行下一场比赛。要选择一个条目,请按ENTER

也可以尝试使用UP / DOWN键在关键字中滚动。



 类似资料:
  • 本文向大家介绍Python 自动补全(vim),包括了Python 自动补全(vim)的使用技巧和注意事项,需要的朋友参考一下 一、vim python自动补全插件:pydiction 可以实现下面python代码的自动补全: 1.简单python关键词补全 2.python 函数补全带括号 3.python 模块补全 4.python 模块内函数,变量补全 5.from module impor

  • 本文向大家介绍jupyter notebook 写代码自动补全的实现,包括了jupyter notebook 写代码自动补全的实现的使用技巧和注意事项,需要的朋友参考一下 操作步骤 进入命令行环境。我使用的是conda。有两种方式进入命令行。 方法1:通过anconda navigator界面,选择environments,选择对应环境名,选择open terminal 方法2:直接使用cmd或者

  • 如果你仍旧希望节约一些打字时间,Atom自带简单的自动补全功能。 通过使用ctrl-space,自动补全工具可以让你看到并插入可选的完整单词。 通常,自动补全工具会浏览当前打开的整个文档,寻找匹配你开始打出来的单词。 如果你想要更多选项,在设置面板的Autocomplete包中,你可以设置为在所有你打开的缓冲区中寻找字符串,而不仅仅是当前文件。 自动补全功能在atom/autocomplete包中

  • 概述 自动补全在你输入时显示一个补全列表,因此你可以输入少量字符就可以完成一个很长的单词输入。对于源代码和 HTML(必须得输入<)这个功能是默认启用的。 禁用自动补全 可以通过auto_complete设置来禁用自动补全。把下面一行加入到Preferences 中Settings - User文件中即可: "auto_complete": false 如果自动补全被禁用了,你可以手动显示自动补

  • 问题内容: 我有兴趣在JFrame中提供自动补全框。触发机制将基于助记符(我认为),但是我不太确定“自动补全框”应使用什么(我希望在用户按下键时对结果进行过滤)。 您将如何实施?某种JFrame还是JPopupMenu? 我想知道这是如何实现的,所以请不要发布指向可用的[J] Components的链接。 问题答案: Sun的教程“使用Swing组件”中提供了 一个自动完成文本区域 的示例 。 它

  • 问题内容: 有谁知道如何设置自动完成功能以与python,django和vim完美配合? 我一直在尝试使用pysmell,但是我似乎无法正确设置它(或者也许我不知道它是如何工作的)。现在,我在django目录中运行pysmell(我正在使用中继),并将结果标签移到我的项目目录中,然后我也在项目目录中运行pysmell。但是,Vim不会拾取django标记,并且它们不会自动完成。 有谁知道如何在vi