|  | from __future__ import annotations | 
|  |  | 
|  | from typing import TYPE_CHECKING | 
|  |  | 
|  | from astroid import nodes | 
|  |  | 
|  | from pylint.checkers import BaseChecker | 
|  |  | 
|  | if TYPE_CHECKING: | 
|  | from pylint.lint import PyLinter | 
|  |  | 
|  | # Checkers should always inherit from `BaseChecker`. | 
|  |  | 
|  |  | 
|  | class MyAstroidChecker(BaseChecker): | 
|  | """Add class member attributes to the class local's dictionary.""" | 
|  |  | 
|  | # The name defines a custom section of the config for this checker. | 
|  | name = "custom" | 
|  | # This class variable declares the messages (i.e. the warnings and errors) | 
|  | # that the checker can emit. | 
|  | msgs = { | 
|  | # Each message has a code, a message that the user will see, | 
|  | # a unique symbol that identifies the message, | 
|  | # and a detailed help message | 
|  | # that will be included in the documentation. | 
|  | "W0001": ("Message that will be emitted", "message-symbol", "Message help") | 
|  | } | 
|  | # This class variable declares the options | 
|  | # that are configurable by the user. | 
|  | options = ( | 
|  | # Each option definition has a name which is used on the command line | 
|  | # and in config files, and a dictionary of arguments | 
|  | # (similar to argparse.ArgumentParser.add_argument). | 
|  | ( | 
|  | "store-locals-indicator", | 
|  | { | 
|  | "default": "properties", | 
|  | "help": ( | 
|  | "The expression name that indicates that the locals should " | 
|  | "be stored" | 
|  | ), | 
|  | }, | 
|  | ), | 
|  | ) | 
|  |  | 
|  | def visit_call(self, node: nodes.Call) -> None: | 
|  | """Called when a :class:`.nodes.Call` node is visited. | 
|  |  | 
|  | See :mod:`astroid` for the description of available nodes. | 
|  | """ | 
|  | if not ( | 
|  | isinstance(node.func, nodes.Attribute) | 
|  | and isinstance(node.func.expr, nodes.Name) | 
|  | and node.func.expr.name == self.linter.config.store_locals_indicator | 
|  | and node.func.attrname == "create" | 
|  | ): | 
|  | return | 
|  | in_class = node.frame() | 
|  | for param in node.args: | 
|  | in_class.locals[param.name] = node | 
|  |  | 
|  |  | 
|  | def register(linter: PyLinter) -> None: | 
|  | """This required method auto registers the checker during initialization. | 
|  |  | 
|  | :param linter: The linter to register the checker to. | 
|  | """ | 
|  | linter.register_checker(MyAstroidChecker(linter)) |