CodeQL 文档

过于复杂的 __del__ 方法

ID: py/overly-complex-delete
Kind: problem
Security severity: 
Severity: recommendation
Precision: high
Tags:
   - efficiency
   - maintainability
   - complexity
   - statistical
   - non-attributable
Query suites:
   - python-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

__del__ 方法用于在对象被删除时释放对象持有的任何资源。只有垃圾收集器才会调用 __del__,它可能在无限延迟后调用,也可能永远不会调用。

因此,不应依赖 __del__ 方法来释放资源,例如文件描述符。相反,应显式释放这些资源。

存在复杂的 __del__ 方法表明这是释放与对象关联的资源的主要或唯一方法。

建议

为了确保正确清理对象,请添加一个显式的 close() 方法或类似的方法。可能需要将对象设置为上下文管理器。

del 方法应该只调用 close()

示例

下面的第一个示例显示了一个依赖 __del__ 来释放资源的类。第二个示例显示了该类的改进版本,其中 __del__ 只是调用 close。


#Relies on __del__ being called by the garbage collector.
class CachedPreferencesFile

    ...

    def __del__(self):
        for key, value in self.preferences.items():
            self.write_pair(key, value)
        self.backing.close()


#Better version
class CachedPreferencesFile

    ...

    def close(self):
        for key, value in self.preferences.items():
            self.write_pair(key, value)
        self.backing.close()

    def __del__(self):
        self.close()

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私