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
相关产品推荐
相关产品推荐

