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不知道这一点。