查找导致异常的执行路径

时间:2015-03-19 14:55:25

标签: python unassigned-variable

我的IDE警告我在分配之前可能存在变量引用。但是我发现它时遇到了麻烦。我已准备好提交错误报告,但也许你可以看到我没看到的内容。

有问题的变量是一个名为check_dialog,分配前的引用警告发生在我为您标记的行中的以下代码段的末尾:

    if dialog:
        validate = None
        string = False

        if dialog == Prompt.YES | Prompt.NO:
            check_dialog = lambda c: chr(c) in 'yn'
        elif dialog == Prompt.CONTINUE | Prompt.QUIT:
            check_dialog = lambda c: chr(c) in 'cq'
        elif dialog == Prompt.YES | Prompt.NO | Prompt.QUIT:
            check_dialog = lambda c: chr(c) in 'ynq'
        else:
            raise ValueError('Invalid dialog argument.')

    answer = None
    while not answer:
        self.addstr(0, 1, prompt)

        if string:
            curses.curs_set(True)
            curses.echo()
            answer = self.getstr(1, 3)
            curses.noecho()
            curses.curs_set(False)
        elif dialog:
            while not check_dialog(answer):  # warning here!
                answer = self.getch()
        else:
            answer = self.getch()

1 个答案:

答案 0 :(得分:1)

你的IDE不是"思考"关于变量的每个可能值(在大多数情况下,这是不可能的),而是使用启发式来防止常见错误。在这种情况下,它注意到check_dialog在if条件中定义,但并非在每种情况下都定义。然而,在这种情况下使用它。那可能是UnboundLocalError

作为程序员,我们可以解释这一点,并看到它注意到的代码路径受到保护。 else案例会引发一个ValueError,但不会被捕获,在两种情况下,(el)if dialog都会使用check_dialog = None,因此这不会有问题。

这不是您的IDE中的错误,因为它正在做它应该做的事情。如果它真的困扰你并且你不能使警告静音,你可以在第一个if dialog的顶部不必要地定义UnboundLocalError之类的东西,它会闭嘴。但是,它也不是您的程序/代码的错误,如上所述,不会导致{{1}}。这是可以安全忽略的,并且由于您的IDE可能如何工作,错误报告将被关闭。