46 lines
1.3 KiB
Python
46 lines
1.3 KiB
Python
|
import sys
|
||
|
import warnings
|
||
|
|
||
|
from ._utils import get_linter_option
|
||
|
|
||
|
|
||
|
__all__ = ["UnusedMustUse", "MustUse"]
|
||
|
|
||
|
|
||
|
class UnusedMustUse(Warning):
|
||
|
pass
|
||
|
|
||
|
|
||
|
class MustUse:
|
||
|
_MustUse__silence = False
|
||
|
_MustUse__warning = UnusedMustUse
|
||
|
|
||
|
def __new__(cls, *args, src_loc_at=0, **kwargs):
|
||
|
frame = sys._getframe(1 + src_loc_at)
|
||
|
self = super().__new__(cls)
|
||
|
self._MustUse__used = False
|
||
|
self._MustUse__context = dict(
|
||
|
filename=frame.f_code.co_filename,
|
||
|
lineno=frame.f_lineno,
|
||
|
source=self)
|
||
|
return self
|
||
|
|
||
|
def __del__(self):
|
||
|
if self._MustUse__silence:
|
||
|
return
|
||
|
if hasattr(self, "_MustUse__used") and not self._MustUse__used:
|
||
|
if get_linter_option(self._MustUse__context["filename"],
|
||
|
self._MustUse__warning.__name__, bool, True):
|
||
|
warnings.warn_explicit(
|
||
|
"{!r} created but never used".format(self), self._MustUse__warning,
|
||
|
**self._MustUse__context)
|
||
|
|
||
|
|
||
|
_old_excepthook = sys.excepthook
|
||
|
def _silence_elaboratable(type, value, traceback):
|
||
|
# Don't show anything if the interpreter crashed; that'd just obscure the exception
|
||
|
# traceback instead of helping.
|
||
|
MustUse._MustUse__silence = True
|
||
|
_old_excepthook(type, value, traceback)
|
||
|
sys.excepthook = _silence_elaboratable
|