__del__
被显式调用¶
ID: py/explicit-call-to-delete
Kind: problem
Security severity:
Severity: warning
Precision: very-high
Tags:
- reliability
- correctness
Query suites:
- python-security-and-quality.qls
__del__
特殊方法旨在由 Python 虚拟机在对象不再可达时调用,但在对象被销毁之前调用。显式调用 __del__
方法可能会导致对象进入不安全状态。
建议¶
如果需要显式清理对象,则应调用 close()
方法,或者更好地,使用 with
语句包装对象的用法。
示例¶
在第一个示例中,程序员调用了 __del__
,而不是以常规方式关闭 zip 文件。第二个示例展示了更安全的替代方法。
def extract_bad(zippath, dest):
zipped = ZipFile(zippath)
try:
zipped.extractall(dest)
finally:
zipped.__del__()
def extract_good(zippath, dest):
zipped = ZipFile(zippath)
try:
zipped.extractall(dest)
finally:
zipped.close()
参考资料¶
Python 标准库:object.del