import astroid from pylint.checkers import BaseChecker from pylint.interfaces import IAstroidChecker # This is our checker class. # Checkers should always inherit from `BaseChecker`. class MyAstroidChecker(BaseChecker): """Add class member attributes to the class locals dictionary.""" # This class variable defines the type of checker that we are implementing. # In this case, we are implementing an AST checker. __implements__ = IAstroidChecker # The name defines a custom section of the config for this checker. name = "custom" # The priority indicates the order that pylint will run the checkers. priority = -1 # This class variable declares the messages (ie 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 those to those 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): """Called when a :class:`.astroid.node_classes.Call` node is visited. See :mod:`astroid` for the description of available nodes. :param node: The node to check. :type node: astroid.node_classes.Call """ if not ( isinstance(node.func, astroid.Attribute) and isinstance(node.func.expr, astroid.Name) and node.func.expr.name == self.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): """This required method auto registers the checker. :param linter: The linter to register the checker to. :type linter: pylint.lint.PyLinter """ linter.register_checker(MyAstroidChecker(linter))