def attr_attributes_transform(node): """Given that the ClassNode has an attr decorator, rewrite class attributes as instance attributes """ # Astroid can't infer this attribute properly # Prevents https://github.com/PyCQA/pylint/issues/1884 node.locals["__attrs_attrs__"] = [astroid.Unknown(parent=node)] for cdefbodynode in node.body: if not isinstance(cdefbodynode, (astroid.Assign, astroid.AnnAssign)): continue if isinstance(cdefbodynode.value, astroid.Call): if cdefbodynode.value.func.as_string() not in ATTRIB_NAMES: continue else: continue targets = ( cdefbodynode.targets if hasattr(cdefbodynode, "targets") else [cdefbodynode.target] ) for target in targets: rhs_node = astroid.Unknown( lineno=cdefbodynode.lineno, col_offset=cdefbodynode.col_offset, parent=cdefbodynode, ) node.locals[target.name] = [rhs_node] node.instance_attrs[target.name] = [rhs_node]
def dataclass_transform(node): """Rewrite a dataclass to be easily understood by pylint""" for assign_node in node.body: if not isinstance(assign_node, (astroid.AnnAssign, astroid.Assign)): continue if (isinstance(assign_node, astroid.AnnAssign) and isinstance(assign_node.annotation, astroid.Subscript) and (isinstance(assign_node.annotation.value, astroid.Name) and assign_node.annotation.value.name == "ClassVar" or isinstance(assign_node.annotation.value, astroid.Attribute) and assign_node.annotation.value.attrname == "ClassVar")): continue targets = (assign_node.targets if hasattr(assign_node, "targets") else [assign_node.target]) for target in targets: rhs_node = astroid.Unknown( lineno=assign_node.lineno, col_offset=assign_node.col_offset, parent=assign_node, ) node.instance_attrs[target.name] = [rhs_node] node.locals[target.name] = [rhs_node]
def add_attribute_nodes(node: astroid.ClassDef, attr_names): for attr_name in attr_names: rhs_node = astroid.Unknown( lineno=node.lineno, parent=node, ) node.locals[attr_name] = [rhs_node] node.instance_attrs[attr_name] = [rhs_node]
def attr_attributes_transform(node): """Given that the ClassNode has an attr decorator, rewrite class attributes as instance attributes """ for cdefbodynode in node.body: if not isinstance(cdefbodynode, astroid.Assign): continue if isinstance(cdefbodynode.value, astroid.Call): if cdefbodynode.value.func.as_string() != ATTR_IB: continue for target in cdefbodynode.targets: rhs_node = astroid.Unknown(lineno=cdefbodynode.lineno, col_offset=cdefbodynode.col_offset, parent=cdefbodynode) node.locals[target.name] = [rhs_node]
def dataclass_transform(node): """Rewrite a dataclass to be easily understood by pylint""" for assign_node in node.body: if not isinstance(assign_node, (astroid.AnnAssign, astroid.Assign)): continue targets = (assign_node.targets if hasattr(assign_node, "targets") else [assign_node.target]) for target in targets: rhs_node = astroid.Unknown( lineno=assign_node.lineno, col_offset=assign_node.col_offset, parent=assign_node, ) node.instance_attrs[target.name] = [rhs_node] node.locals[target.name] = [rhs_node]
return False for decorator_attribute in node.decorators.nodes: if isinstance(decorator_attribute, astroid.Call): # decorator with arguments decorator_attribute = decorator_attribute.func if decorator_attribute.as_string() in decorator_names: return True return False def attr_attributes_transform(node): """Given that the ClassNode has an attr decorator, rewrite class attributes as instance attributes """ # Astroid can't infer this attribute properly # Prevents https://github.com/PyCQA/pylint/issues/1884 node.locals["__attrs_attrs__"] = [astroid.Unknown(parent=node)] for cdefbodynode in node.body: if not isinstance(cdefbodynode, (astroid.Assign, astroid.AnnAssign)): continue if isinstance(cdefbodynode.value, astroid.Call): if cdefbodynode.value.func.as_string() not in ATTRIB_NAMES: continue else: continue targets = ( cdefbodynode.targets if hasattr(cdefbodynode, "targets") else [cdefbodynode.target] ) for target in targets: