my linter constantly bugs me with unused variable warning, for the following class that I have created:
class LockGuard(object):
def __init__(self, mutex):
self.mutex = mutex
self.mutex.acquire()
def __del__(self):
self.mutex.release()
in code, I get the warning everytime I use this
def do_something(self)
locker = LockGuard(self.mutex)
// do something on the data
return outcome
I know that c++ compilers optimize unused variables out, I was wondering if python ever does the same? Therefore remove the lock on data.
The linter should bug you about this. Because the correct way to manage context is with a context manager.
with LockGuard():
# do stuff
Put the implementation details of how to acquire and release a lock into LockGuard.__enter__ and LockGuard.__exit__ respectively.
You should not rely on __init__ and __del__ for this, because __del__ is not reliable.
I know that C++ compilers optimize unused variables out, I was wondering if Python ever does the same? Therefore remove the lock on data.
Python will not do the same. There are some peephole optimizations, but nothing so drastic as removing an object from scope entirely. Once the reference count of an instance falls to zero (i.e. once locker name goes out of scope), it should be deleted, but there is no guarantee in the implementation about when this happens and there is not even a guarantee that a custom __del__ will be called at all.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With