python是否优化了未使用的变量?

apr*_*amc 4 python

对于我创建的以下类,我的linter经常给我发出未使用的变量警告:

class LockGuard(object):
    def __init__(self, mutex):
        self.mutex = mutex
        self.mutex.acquire()

    def __del__(self):
        self.mutex.release()
Run Code Online (Sandbox Code Playgroud)

在代码中,每次我使用它时都会收到警告

def do_something(self)
    locker = LockGuard(self.mutex)
    // do something on the data
    return outcome
Run Code Online (Sandbox Code Playgroud)

我知道c ++编译器优化了未使用的变量,我想知道python是否会做同样的事情?因此,删除数据锁定.

wim*_*wim 10

这个短信应该对你有所了解.因为管理上下文的正确方法是使用上下文管理器.

with LockGuard():
    # do stuff
Run Code Online (Sandbox Code Playgroud)

将如何获取和释放锁,实现细节LockGuard.__enter__LockGuard.__exit__分别.

你不应该依赖__init____del__为此,因为__del__不可靠.

我知道C++编译器会优化未使用的变量,我想知道Python是否也会这样做?因此,删除数据锁定.

Python不会这样做.有一些窥视孔优化,但没有像完全从范围中删除对象那么激烈.一旦实例的引用计数降为零(即一旦locker名称超出范围),它应该被删除,但是在实现中不能保证何时发生这种情况并且甚至不能保证__del__将调用自定义一点都不


Dan*_*den 5

你滥用这个__del__方法.

请参阅文档中object.__del__的巨大警告块:

警告:由于不稳定的情况下,它__del__()被调用的方法,[...] .特别是:

  • __del__()可以在执行任意代码时调用,包括来自任意线程.如果__del__()需要锁定或调用任何其他阻塞资源,它可能会死锁,因为资源可能已被执行中断的代码占用__del__(). (强调我的)
  • __del__()可以在解释器关闭期间执行.[...]

正确的解决方案是实现上下文管理器并使用该with语句进入和退出它.