python是否优化了未使用的变量?
对于我创建的以下类,我的linter经常使用未使用的变量警告来烦我: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
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