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

python是否优化了未使用的变量?,python,Python,对于我创建的以下类,我的linter经常使用未使用的变量警告来烦我: class LockGuard(object): def __init__(self, mutex): self.mutex = mutex self.mutex.acquire() def __del__(self): self.mutex.release() 在代码中,我每次使用这个时都会收到警告 def do_something(self) lo

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

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

    def __del__(self):
        self.mutex.release()
在代码中,我每次使用这个时都会收到警告

def do_something(self)
    locker = LockGuard(self.mutex)
    // do something on the data
    return outcome

<>我知道C++编译器优化了未使用的变量,我想知道Python是否也这么做过?因此,请解除对数据的锁定。

对于此简单函数

def f():
    a = 3
答案是否定的:没有优化;拆卸

from dis import dis

dis(f)
给出:

  6           0 LOAD_CONST               1 (3)
              3 STORE_FAST               0 (a)
              6 LOAD_CONST               0 (None)
              9 RETURN_VALUE
因此,
a
被分配(…然后不以任何方式使用)。你可以检查你的代码;我很肯定会是一样的

关于如何修复代码:我同意。

关于这一点,linter应该会给你带来麻烦。因为管理上下文的正确方法是使用

将如何获取和释放锁的实施细节分别放入
LockGuard.\uuuu进入\uuuu
LockGuard.\uuuu退出\uuuu

您不应该依赖于
\uuuuu init\uuuu
\uuuu del\uuuu
,因为
\uuuu del\uuuu
是不可靠的

<>我知道C++编译器优化了未使用的变量,我想知道Python是否也这么做过?因此,移除对数据的锁定


Python不会做同样的事情。有一些窥视孔优化,但没有什么比完全从范围中删除对象更激烈的了。一旦实例的引用计数降至零(即,
locker
name一旦超出范围),就应该将其删除,但在实现中无法保证何时发生这种情况,甚至无法保证将调用自定义的
\u del\u

您误用了
方法

请参见中的巨大警告块:

警告:由于调用
\uu del\uu()
方法的不稳定情况,[…]。特别是:

  • 当执行任意代码时,包括从任意线程执行任意代码时,可以调用
    \uuu del\uu()
    如果
    \uuuu del_uuu()
    需要锁定或调用任何其他阻塞资源,则可能会死锁,因为该资源可能已经被中断执行
    \uuu del_uuu()
    的代码占用(强调我的)
  • \uuu del\uu()
    可以在解释器关闭期间执行。[……]

正确的解决方案是实现A,使用<>代码> Calor进入和退出.P/th> Python不是C++,所以这种方法可能不是最好的计划。如果你想要一个“范围守护”,你不应该使用<代码>您应该改用上下文管理器对象,因为这正是它们的设计目的。@DanielPryden我支持这一点。不要使用

\uu del\uu
,使用上下文管理器,这正是它们的用途。
with LockGuard():
    # do stuff