You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用inquirer时出现重复问询两次的问题如何解决

问题根因

这个bug和inquirer模块无关,是代码主逻辑的写法错误,两个核心问题:

  • 主流程重复调用了op_cselector():第一次调用在if判断位置,如果你第一次选的是「Edit line」,if分支条件不成立,走到elif判断时会第二次执行op_cselector(),再次弹出选择菜单,这就是重复问询的直接原因。如果第二次选择的不是「Edit line」,两个分支都匹配不上,程序就会无报错直接退出。
  • 字符串比较误用了is:is的作用是判断两个变量是否指向内存中的同一个对象,不是判断值是否相等。Python对短字符串的缓存机制会让部分场景下is判断碰巧返回正确结果,但这个写法存在严重的兼容性隐患,很容易出现判断失效。
修复方案

不需要更换交互模块,inquirer完全可以正常使用,只要修正逻辑错误即可:

  • 仅调用一次op_cselector(),将返回的操作结果存入变量,基于这个变量做分支判断,不要在条件判断语句中重复调用函数
  • 所有字符串值的比较统一使用==替代is
  • (可选优化)原代码存在重复打开文件、文件句柄未安全关闭的问题,建议用with上下文管理器处理文件操作,自动完成文件关闭,避免资源泄漏或文件写入异常。
修复后的完整代码
import inquirer


def edit_line(file):
    # 用with上下文管理器自动处理文件关闭,无需手动调用close
    with open(file, 'r') as f:
        content = f.read()
    print('Your file: \n' + content)
    list_of_lines = content.splitlines(keepends=True)
    index = int(input('What line would you like to edit?: ')) - 1
    list_of_lines[index] = input('Write your text here: ') + '\n'

    with open(file, 'w') as f:
        f.writelines(list_of_lines)
    
    with open(file, 'r') as f:
        new_content = f.read()
    print('\nYour new file:\n' + new_content)


def add_line(file):
    with open(file, 'r') as f:
        content = f.read()
    print('Your file: \n' + content)
    append_text = input('Enter text to add: ')
    with open(file, 'a') as f:
        f.write('\n' + append_text)
    
    with open(file, 'r') as f:
        new_content = f.read()
    print('Your new file:\n' + new_content)


def op_cselector():
    questions = [
        inquirer.List('operation',
                      message='What would you like to do?: ',
                      choices=['Add line', 'Edit line']
                      )
    ]
    answers = inquirer.prompt(questions)
    return answers['operation']


# 仅调用一次选择函数,结果存入变量,不要在分支判断中重复调用
selected_op = op_cselector()
if selected_op == 'Add line':
    add_line('sample.txt')
elif selected_op == 'Edit line':
    edit_line('sample.txt')
使用提示

如果偏好inquirer的交互效果完全可以继续使用,这类重复执行的bug是函数调用位置写错导致的,和模块能力无关。后续写分支逻辑时,凡是需要用到函数返回值做判断的场景,都先把返回值赋值给变量再做判断,就能避免同类问题。

内容的提问来源于stack exchange,提问作者Internet Warrior

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:27:14