首页 > 编程语言 >python pyreadline补全进阶 #多字段补全

python pyreadline补全进阶 #多字段补全

时间:2023-11-21 19:56:50浏览次数:50  
标签:补全 python buffer 自动 readline completer 多字段 函数

先看一个实例

在Python的readline模块中,readline.set_completer() 函数用于设置一个自动补全函数(completer)来为用户提供命令行输入的自动补全功能。

completer函数接受一个文本输入作为参数,并返回一个包含可能的自动补全选项的列表。当用户在命令行中输入时,readline模块会调用这个completer函数来获取可能的自动补全选项,从而帮助用户进行输入。

下面是一个简单的示例,展示了如何定义一个completer函数并将其传递给readline.set_completer()

import readline

# 定义一个简单的自动补全函数
def my_completer(text, state):
    options = ['apple', 'banana', 'cherry', 'date']  # 可能的自动补全选项
    matches = [option for option in options if option.startswith(text)]  # 找到以输入文本开头的选项
    if state < len(matches):  # 返回匹配的选项
        return matches[state]
    else:
        return None

# 将自动补全函数设置为默认的自动补全器
readline.set_completer(my_completer)
readline.parse_and_bind('tab: complete')  # 绑定Tab键来触发自动补全

在这个示例中,my_completer 函数接受用户输入的文本和当前的状态作为参数,并返回可能的自动补全选项。然后,我们使用 readline.set_completer() 将这个自动补全函数设置为默认的自动补全器。

当用户在命令行中输入时,Tab键将会触发自动补全功能,并调用my_completer函数来获取可能的自动补全选项。

实测:(亲测可行)

import readline
# import rlcompleter

# 定义可能的命令和参数
commands = {
    'command1': ['option1', 'option2', 'option3'],
    'command2': ['option4', 'option5', 'option6'],
    'command3': ['option7', 'option8', 'option9'],
}
commands3=["show","get","know"]


# 定义补全函数
def completer(text, state):
    # 这里只能用get_line_buffer,可以获得所有输入过的指令 用空格分割
    buffer = readline.get_line_buffer().split(" ")
    # buffer = text.split(" ")  ## text表示当前正在输入的字符
    # print("buffer:",buffer)
    if len(buffer) <=1:
        return [cmd for cmd in commands.keys() if cmd.startswith(text)][state]    ##先拿第一层键
    elif len(buffer)==2:
        return [cmd for cmd in commands[buffer[0]] if cmd.startswith(text)][state] ## 第二层拿值
    elif len(buffer)==3:
        return [cmd for cmd in commands3 if cmd.startswith(text)][state]   ##state表示匹配状态 每次都要加
    else:
        return None

# 设置补全函数
readline.parse_and_bind("tab: complete")
readline.set_completer(completer)

# 获取用户输入
while True:
    user_input = input("myshell>: ")
    # print(f"You entered: {user_input}")
    if user_input=="q":
        break

效果截图:
image

标签:补全,python,buffer,自动,readline,completer,多字段,函数
From: https://www.cnblogs.com/codedingzhen/p/17847406.html

相关文章

  • python常用小知识
    使用Path().rglob()时,不能立即删除该目录下的文件夹,否则报找不到目录的问题;原因:待遍历的子目录被保存了,但你在外部删除了,rglob()内部未感知到,从而导致错误;os.path.basename()可获取到文件名(带后缀那种),要不带后缀,需要自己处理;但Path().stem可直接获取文件名(不带后缀),Path().name可......
  • 【Python】【OpenCV】视频帧和摄像头帧操作 and 窗口显示
    一、读取写入视频文件1importcv223#创建一个视屏捕获对象4videoCapture=cv2.VideoCapture('AVI.avi')56#获取视频的属性值,cv2.CAP_PROP_FPS获取视频帧率7fps=videoCapture.get(cv2.CAP_PROP_FPS)89#cv2.CAP_PROP_FRAME_WIDTH/HEIGHT返回floa......
  • Python——第三章:函数的返回值
    函数的返回值:函数执行之后.会给调用方一个结果.这个结果就是返回值关于return:    函数只要执行到了return.函数就会立即停止并返回内容.函数内的return的后续的代码不会执行    1.如果函数内没有return,此时外界收到的是None    2.如果写了re......
  • 聪明办法学Python_task1_11.20-11.21
    聪明办法学Python_task1_11.20-11.211.task011.1Python灵魂三问1.2Python环境配置2.task022.1注释2.2基本控制台输出2.3错误2.4基本控制台输入2.5导入模块1.task01:Python简介/安装1.1Python灵魂三问为什么学Python?Python是全球最流行的编程语言......
  • Vscode怎么指定Python解释器
    Windows使用Vscode编写Python代码默认使用系统手动安装的设置在环境变量的Python解释器,如果需要修改称虚拟解释器conda则可以使用以下方法软件中央上部选择"显示并运行命令"Python:选择解释器选择需要的解释器......
  • Python 中函数 range
    range函数简要说明接收参数为1/2/3,表示的是左闭右开接收参数当使用Python中的range()函数时,可以总结如下使用方法:range(stop):生成从0到stop-1的整数序列。产生的序列包含起始值0,但不包含stop。foriinrange(5):print(i)输出:01234range(start,stop):生成......
  • python连接数据库到excel 第二回
    #使用前建议看一下sqllalchemy和create_engine,主要就是数据库拉数据导入excel#下面是代码部分fromsqlalchemyimportcreate_engine,text#利用sqlalchemy顺带用create_engine,text区分大小写importpandasaspd#表host='cs-'user='root'password='6Ep'db='perf......
  • python学习第二天笔记(未完成)
    #python(11.20--11.21)数数从0开始,左闭右开,不输默认。注意行对齐##注释:#单行注释“”“多行注释”“”##类型intstr(字符串,单个字符使长度为1的字符串)float(默认双精度)list注释:同一段代码对当变量类型不同时会产生不同的效果:譬如print(a+b)当a="1"b="2"......
  • Python为什么执行效率低,性能不如其他语言?
    Python是一种解释型语言,它的执行效率通常比编译型语言低,这主要有以下几个原因:解释型语言的性质:Python是解释型语言,这意味着它在运行时需要解释器来逐行翻译并执行代码。这个过程中,相对于编译型语言(如C++或Java),会产生额外的性能开销。动态类型:Python是动态类型的语言,这意......
  • Python爬虫技巧:百万级数据怎么爬取?
    前言在实际的爬取过程中,我们经常会遇到一些需要大量爬取数据的情况,比如爬取某个网站的所有用户信息或者某个行业的所有产品信息等等。在这些情况下,我们需要优化我们的爬虫策略,提高我们的数据爬取效率,同时需要注意避免被目标网站封禁。本文将分享一些Python爬虫处理百万级数据的技巧......