third_party.pylibs.pylint.src/pylint/checkers/threading_checker.py
Pierre Sassoulas 9e0baf370a Simplify hard to maintain copyright notice
git is the source of truth for the copyright, copyrite (the tool)
was taking exponentially longer with each release, and it's
polluting the code with sometime as much as 50 lines of names.
2022-03-24 13:06:15 +01:00

61 lines
1.9 KiB
Python

# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/PyCQA/pylint/graphs/contributors
from typing import TYPE_CHECKING
from astroid import nodes
from pylint import interfaces
from pylint.checkers import BaseChecker
from pylint.checkers.utils import check_messages, safe_infer
if TYPE_CHECKING:
from pylint.lint import PyLinter
class ThreadingChecker(BaseChecker):
"""Checks for threading module.
- useless with lock - locking used in wrong way that has no effect (with threading.Lock():)
"""
__implements__ = interfaces.IAstroidChecker
name = "threading"
LOCKS = frozenset(
(
"threading.Lock",
"threading.RLock",
"threading.Condition",
"threading.Semaphore",
"threading.BoundedSemaphore",
)
)
msgs = {
"W2101": (
"'%s()' directly created in 'with' has no effect",
"useless-with-lock",
"Used when a new lock instance is created by using with statement "
"which has no effect. Instead, an existing instance should be used to acquire lock.",
),
}
@check_messages("useless-with-lock")
def visit_with(self, node: nodes.With) -> None:
context_managers = (c for c, _ in node.items if isinstance(c, nodes.Call))
for context_manager in context_managers:
if isinstance(context_manager, nodes.Call):
infered_function = safe_infer(context_manager.func)
if infered_function is None:
continue
qname = infered_function.qname()
if qname in self.LOCKS:
self.add_message("useless-with-lock", node=node, args=qname)
def register(linter: "PyLinter") -> None:
linter.register_checker(ThreadingChecker(linter))