Python 无法定义变量

Python 无法定义变量,python,django,pycharm,Python,Django,Pycharm,我有一段代码: from django.db import transaction with transaction.atomic(): try: variable = 1 except Exception: raise Exception() print(variable) pycharm(2018.1.2)告诉我,打印函数中的变量不能定义。在哪种情况下会发生?或者它是一个魅力虫 在哪种情况下会发生 如果上下文管理器接受该异常,并且在执行流

我有一段代码:

from django.db import transaction

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

print(variable)
pycharm(2018.1.2)告诉我,
打印
函数
中的
变量
不能定义
。在哪种情况下会发生?或者它是一个魅力虫

在哪种情况下会发生

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

经验法则:不依赖于条件(在最一般意义上)的代码不应使用条件定义的名称,并且只有属于定义名称的分支的代码才应访问此名称

即使您“知道”在当前的实现中,如果没有定义(如您的示例中),这个名称将永远不会被访问,任何微小的实现更改都可能会破坏这个前提条件,并且您可能不一定注意到它,也没有足够的unittest覆盖率来确保您的测试能够解决这个问题。我经常看到这种情况发生,有时错误只在更改后几个月才会出现(通常是在一些非常罕见的病态情况下的错误处理代码中)


长话短说,在有条件的部分之前,无条件地用一些哨兵值(
None
或任何其他有意义的值)定义名称,以确保您的代码不会在本应是较小的代码更改后意外中断。

@DanielRoseman这只是一个示例,在我发现这一点的原始代码中,我捕获了另一个异常并提出了不同的:)这里我只是简化了它。。。捕获的异常和引发的异常可能有所不同。@AntoinnelB但如果出现异常,我们将永远无法实现
打印
功能,据我所知,这不应该是一个问题。问题是带的
在理论上可能会吞没异常<代码>事务。原子的
不能做到这一点,但pycharm不知道这一点。