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

阿尔·伯格

我只是使用“ curses”的初学者,不能肯定地说这是python的“ curses”模块中的错误还是我的用法不正确。

我有以下测试代码:

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代码中可以看出,处理关键事件的函数实际上会调用自身:

def _insert_printable_char(self, ch):
    (y, x) = self.win.getyx()
    if y < self.maxy or x < self.maxx:
        if self.insert_mode:
            oldch = self.win.inch()

        try:
            self.win.addch(ch)
        except curses.error:
            pass
        if self.insert_mode:
            (backy, backx) = self.win.getyx()
            if curses.ascii.isprint(oldch):
                self._insert_printable_char(oldch) # <--- Is it bug?
                self.win.move(backy, backx)

这是pythontextpad.py模块中的错误,还是我的代码中缺少某些curses的初始化步骤?

亚历克斯·马丁里(Alex Martelli)

我可以重现该问题,它似乎是通过在插入模式下将文本框下面的窗口设置为“太宽”而触发的。避免多次初始化(包装程序完成了所有工作),请考虑:

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

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

我将继续调试,添加日志记录以确切地了解问题所在,但与此同时,我想发布此消息,因为您可以使用稍微更窄的窗口来进行操作,并避免触发错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

内核模块中的调试堆栈溢出

来自分类Dev

内核模块中的调试堆栈溢出

来自分类Dev

delphi中的堆栈溢出错误

来自分类Dev

递归方法中的堆栈溢出错误

来自分类Dev

处理中的堆栈溢出

来自分类Dev

如何在golang中捕获堆栈溢出错误

来自分类Dev

如何修复Java中的堆栈溢出错误?

来自分类Dev

代码返回堆栈溢出错误在Java中的递归

来自分类Dev

最终块中的堆栈溢出错误处理

来自分类Dev

MVcHtmlString中的堆栈溢出异常

来自分类Dev

MVcHtmlString中的堆栈溢出异常

来自分类Dev

Java中的堆栈溢出异常

来自分类Dev

整数会在Python中溢出吗?

来自分类Dev

诅咒中的退格字符

来自分类Dev

从回调中递归调用函数会导致堆栈溢出吗?

来自分类Dev

使用goto避免深度函数调用中的堆栈溢出是一个好主意吗?

来自分类Dev

递归函数中堆栈溢出的原因

来自分类Dev

跟踪流星/节点光纤中的堆栈溢出

来自分类Dev

我的Haskell代码中的堆栈溢出

来自分类Dev

处理/避免C中的堆栈溢出

来自分类Dev

概率计算中的堆栈溢出异常

来自分类Dev

F#中的尾递归:堆栈溢出

来自分类Dev

Designer.cs中的堆栈溢出

来自分类Dev

C ++析构函数中的堆栈溢出

来自分类Dev

了解C中的堆栈溢出处理

来自分类Dev

概率计算中的堆栈溢出异常

来自分类Dev

在std :: map中搜索时堆栈溢出

来自分类Dev

C编程中堆栈溢出的含义

来自分类Dev

Fibonacci函数中的递归堆栈溢出