def leave_module(self, node: nodes.Module) -> None: # Check imports are grouped by category (standard, 3rd party, local) std_imports, ext_imports, loc_imports = self._check_imports_order(node) # Check that imports are grouped by package within a given category met_import: Set[str] = set() # set for 'import x' style met_from: Set[str] = set() # set for 'from x import y' style current_package = None for import_node, import_name in std_imports + ext_imports + loc_imports: if not self.linter.is_message_enabled("ungrouped-imports", import_node.fromlineno): continue met = met_from if isinstance(import_node, nodes.ImportFrom) else met_import package, _, _ = import_name.partition(".") if (current_package and current_package != package and package in met and is_node_in_guarded_import_block(import_node) is False): self.add_message("ungrouped-imports", node=import_node, args=package) current_package = package met.add(package) self._imports_stack = [] self._first_non_import_node = None
def _ignore_import_failure(node, modname, ignored_modules): for submodule in _qualified_names(modname): if submodule in ignored_modules: return True if is_node_in_guarded_import_block(node): # Ignore import failure if part of guarded import block # I.e. `sys.version_info` or `typing.TYPE_CHECKING` return True return node_ignores_exception(node, ImportError)