我有这段代码:
from django.db import transaction
with transaction.atomic():
try:
variable = 1
except Exception:
raise Exception()
print(variable)
pycharm(2018.1.2)告诉我,print
函数中的变量
不能被定义。什么情况下会发生?或者是 pycharm 的 bug?
最佳答案
in which case it can happen?
如果上下文管理器吞下异常,并且将 raise
语句替换为在到达 print(variable)
之前不会中断执行流的其他内容> 线。
根据经验:不依赖于条件(最一般含义)的代码不应使用有条件定义的名称,并且只有与定义名称的分支属于同一分支的代码才应该使用访问该名称。
即使您“知道”在当前实现中如果未定义,则永远不会访问此名称(如您的示例中所示),任何微小的实现更改都可能会破坏此前提条件,而您可能不会不一定会注意到它,也没有足够的单元测试覆盖率来确保您的测试能够发现问题。我经常看到这种情况发生,有时该错误仅在更改几个月后才出现(通常在一些非常罕见的病态极端情况的错误处理代码中)。
长话短说,在条件部分之前无条件地使用一些标记值(None
或任何其他有意义的值)定义名称将确保您的代码不会中断在本来应该是小的代码更改之后出乎意料地发生了。
关于python - 变量不能被定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50327242/