python - Python版本之间的变量范围差异
问题描述
考虑以下代码:
import shutil
import time
t = time.time()
exception = None
while time.time() < (t + 10.0):
try:
shutil.rmtree('/path-to-non-existent-directory')
break
except OSError as exception:
pass
time.sleep(0.1)
else:
if exception:
raise exception
在 Python 2.7 中,此代码完全有效,但在 Python 3.7 中,我收到以下警告:
Local variable exception might be referenced before assignment
在else
条款中。
有谁知道在 Python 3.7 中运行此代码段有什么问题?
解决方案
在 Python 3 中,为了解决由于引入__traceback__
属性而导致的循环引用问题,在块except
的末尾会自动删除一个目标except
。它的行为就像你写的一样
except OSError as exception:
pass
del exception
这记录在PEP 3110中。
如果要保留异常对象,应将其保存到第二个变量:
except OSError as exception:
saved_exception = exception
exception
仍将被删除,但您可以在块结束saved_exception
后使用检查异常对象。except
推荐阅读
- fortran - f2py 在使用感叹号注释连接 Fortran77 文件时引发“断言错误”
- python-3.x - 如何将数据框中的字符串更改为整数?
- android - 插入联系人的绝对 URI
- javascript - Vuejs:使用“props”在组件之间传递数据是一种安全的方式吗?
- java - BIRT 从 2.6.2 升级到 4.2.2 导致报告中出现“空”标签
- android - 我的 Android 应用已从 Playstore 中删除,原因是:违反使用 Android 广告 ID
- azure - Azure DevOps - 清理本地服务器上的旧版本?
- java - 迁移到 java11
- angular - 如何检查是否有人订阅了 Angular 中的 EventEmitter?
- excel - 在 For 循环中向单元格添加超链接