python诅咒中的堆栈溢出。是模块中的bug吗?

2024-04-25 01:39:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是一个使用“curses”的初学者,不能确定这是python的“curses”模块中的bug还是我的错误用法。在

我有以下测试代码:

import curses
import curses.textpad

screen = curses.initscr()
curses.noecho()
cl = curses.newwin( 15, 80, 10, 1 )
txtbox = curses.textpad.Textbox(cl,insert_mode=True)

def main( scr ):
    global txtbox
    s = txtbox.edit()
    print(s)    

if __name__ == '__main__':
    ret = curses.wrapper( main )

当我运行它时,它开始正常,但是当按下任何键时,它开始无限递归并导致堆栈溢出。从curses/textpad.py代码中可以看出,处理关键事件的函数实际上调用了自己:

^{pr2}$

是python的textpad.py模块中的bug,还是我的代码中遗漏了一些curses的初始化步骤?在


Tags: 模块代码pyimport用法clmain错误
1条回答
网友
1楼 · 发布于 2024-04-25 01:39:43

我可以重现这个问题,它似乎是由在插入模式下使文本框的窗口“太宽”而触发的。避免多次初始化(包装器完成所有操作),请考虑:

import curses
import curses.textpad
import curses.wrapper

def main(scr):
    win = curses.newwin( 15, 60, 10, 1 )
    txtbox = curses.textpad.Textbox(win, insert_mode=True)
    s = txtbox.edit()
    return s

if __name__ == '__main__':
    ret = curses.wrapper( main )
    print ret

但是,如果将第二个参数改为newwin回80,则会触发错误。(_insert_printable_char中实现插入模式的递归似乎很好,它应该终止,因为它最终遇到了边框或不可打印字符,但显然当窗口太宽时就不会了)。在

我将继续调试,添加日志以查看到底出了什么问题,但同时我想发布这篇文章,因为您可以使用稍微窄一点的窗口来避免触发bug)。在

相关问题 更多 >