变量无法定义

时间:2018-05-14 09:36:54

标签: python django pycharm

我有这段代码:

from django.db import transaction

with transaction.atomic():
    try:
        variable = 1
    except Exception:
        raise Exception()

print(variable)

并且pycharm(2018.1.2)告诉我variable函数print中的can be not defined。在哪种情况下会发生?或者它是一个pycharm bug?

1 个答案:

答案 0 :(得分:2)

  

在哪种情况下会发生?

如果上下文管理器吞下该异常,并且您将raise语句替换为在执行流程到达print(variable)行之前不会中断的任何其他内容。

根据经验法则:不依赖于条件的代码(最常见的含义)不应使用条件定义的名称,只有与定义名称的分支属于同一分支的代码才应使用访问此名称。

即使您“知道”当前实现中的 ,如果未定义(如您的示例中),也永远不会访问此名称,任何甚至是次要的实现更改都可能会破坏此前提条件,您可能不会必须注意它,也没有足够的单位测试覆盖率,以确保您的测试能够解决问题。我经常看到这种情况经常发生,有时候这个bug只会在变化后几个月出现(通常是在一些非常罕见的病态角落情况下的错误处理代码中)。

总而言之,在条件部分之前无条件地定义具有一些标记值(None或其他任何有意义的名称)的名称将确保您的代码不会意外地破坏应该是一个小的代码更改。