From 60daec60011d0b3a6be52c9410d1d7ef0179349d Mon Sep 17 00:00:00 2001 From: Jacob Walls Date: Tue, 16 May 2023 08:25:25 -0400 Subject: Add optional `prefer-typing-namedtuple` message (#8681) Closes #8660 --- pylint/extensions/code_style.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'pylint/extensions/code_style.py') 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) -- cgit v1.2.1