summaryrefslogtreecommitdiff
path: root/pylint/extensions/code_style.py
diff options
context:
space:
mode:
Diffstat (limited to 'pylint/extensions/code_style.py')
-rw-r--r--pylint/extensions/code_style.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/pylint/extensions/code_style.py b/pylint/extensions/code_style.py
index 5ce1ae476..622601c75 100644
--- a/pylint/extensions/code_style.py
+++ b/pylint/extensions/code_style.py
@@ -69,6 +69,17 @@ class CodeStyleChecker(BaseChecker):
"default_enabled": False,
},
),
+ "R6105": (
+ "Prefer 'typing.NamedTuple' over 'collections.namedtuple'",
+ "prefer-typing-namedtuple",
+ "'typing.NamedTuple' uses the well-known 'class' keyword "
+ "with type-hints for readability (it's also faster as it avoids "
+ "an internal exec call).\n"
+ "Disabled by default!",
+ {
+ "default_enabled": False,
+ },
+ ),
}
options = (
(
@@ -89,12 +100,22 @@ class CodeStyleChecker(BaseChecker):
def open(self) -> None:
py_version = self.linter.config.py_version
+ self._py36_plus = py_version >= (3, 6)
self._py38_plus = py_version >= (3, 8)
self._max_length: int = (
self.linter.config.max_line_length_suggestions
or self.linter.config.max_line_length
)
+ @only_required_for_messages("prefer-typing-namedtuple")
+ def visit_call(self, node: nodes.Call) -> None:
+ if self._py36_plus:
+ called = safe_infer(node.func)
+ if called and called.qname() == "collections.namedtuple":
+ self.add_message(
+ "prefer-typing-namedtuple", node=node, confidence=INFERENCE
+ )
+
@only_required_for_messages("consider-using-namedtuple-or-dataclass")
def visit_dict(self, node: nodes.Dict) -> None:
self._check_dict_consider_namedtuple_dataclass(node)