def _check_bound_methods(self, node: types.AnyFunctionDef) -> None: node_context = nodes.get_context(node) if not isinstance(node_context, ast.ClassDef): return if not functions.get_all_arguments(node): self.add_violation( oop.MethodWithoutArgumentsViolation(node, text=node.name), ) if node.name in constants.MAGIC_METHODS_BLACKLIST: self.add_violation( oop.BadMagicMethodViolation(node, text=node.name), ) is_async = isinstance(node, ast.AsyncFunctionDef) if is_async and access.is_magic(node.name): if node.name in constants.ASYNC_MAGIC_METHODS_BLACKLIST: self.add_violation( oop.AsyncMagicMethodViolation(node, text=node.name), ) self._check_useless_overwritten_methods( node, class_name=node_context.name, )
def does_contain_consecutive_underscores(name: str) -> bool: """ Checks if name contains consecutive underscores in middle of name. >>> does_contain_consecutive_underscores('name') False >>> does_contain_consecutive_underscores('__magic__') False >>> does_contain_consecutive_underscores('__private') False >>> does_contain_consecutive_underscores('name') False >>> does_contain_consecutive_underscores('some__value') True >>> does_contain_consecutive_underscores('__some__value__') True >>> does_contain_consecutive_underscores('__private__value') True >>> does_contain_consecutive_underscores('some_value__') True """ if access.is_magic(name) or access.is_private(name): return '__' in name.strip('_') return '__' in name
def _check_magic_attribute(self, node: ast.Attribute) -> None: if access.is_magic(node.attr): if node.attr in ALL_MAGIC_METHODS: self._ensure_attribute_type( node, DirectMagicAttributeAccessViolation, )
def _check_magic_attribute(self, node: ast.Attribute) -> None: if access.is_magic(node.attr): if node.attr not in self._allowed_magic_attributes: self._ensure_attribute_type( node, DirectMagicAttributeAccessViolation, )
def _check_module_name(self) -> None: if logical.is_wrong_name(self.stem, constants.MODULE_NAMES_BLACKLIST): self.add_violation(naming.WrongModuleNameViolation()) if access.is_magic(self.stem): if self.stem not in constants.MAGIC_MODULE_NAMES_WHITELIST: self.add_violation(naming.WrongModuleMagicNameViolation()) if access.is_private(self.stem): self.add_violation(naming.PrivateNameViolation(text=self.stem)) if logical.does_contain_unicode(self.stem): self.add_violation(naming.UnicodeNameViolation(text=self.stem))
def is_wrong_alias(variable_name: str) -> bool: """ Tells whether a variable is wrong builtins alias or not. >>> is_wrong_alias('regular_name_') True >>> is_wrong_alias('_') False >>> is_wrong_alias('_async') False >>> is_wrong_alias('_await') False >>> is_wrong_alias('regular_name') False >>> is_wrong_alias('class_') False >>> is_wrong_alias('list_') False >>> is_wrong_alias('list') False >>> is_wrong_alias('__spec__') False """ if is_magic(variable_name): return False if is_unused(variable_name) or not variable_name.endswith('_'): return False return not is_builtin_name(variable_name[:-1])