diff options
author | Marc Mueller <30130371+cdce8p@users.noreply.github.com> | 2021-07-19 22:02:16 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-19 22:02:16 +0200 |
commit | bf493bb85e4419411d648df1355a694a6106c4e3 (patch) | |
tree | 2849be1345f4df4415485d68b947c645c9f95baf /pylint/checkers/imports.py | |
parent | 6a166250526b1c6da25c639327197e3ad05709f4 (diff) | |
download | pylint-git-bf493bb85e4419411d648df1355a694a6106c4e3.tar.gz |
Ignore import errors if in guarded import block (#4702)
* Ignore import errors if in guarded import block
* Use new astroid helper methods
Diffstat (limited to 'pylint/checkers/imports.py')
-rw-r--r-- | pylint/checkers/imports.py | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/pylint/checkers/imports.py b/pylint/checkers/imports.py index 4be36ed71..973bd00e4 100644 --- a/pylint/checkers/imports.py +++ b/pylint/checkers/imports.py @@ -49,7 +49,7 @@ import copy import os import sys from distutils import sysconfig -from typing import Dict, List, Union +from typing import Dict, List, Set, Union import astroid @@ -58,6 +58,7 @@ from pylint.checkers.utils import ( check_messages, get_import_name, is_from_fallback_block, + is_node_in_guarded_import_block, node_ignores_exception, ) from pylint.exceptions import EmptyReportError @@ -119,18 +120,10 @@ def _ignore_import_failure(node, modname, ignored_modules): if submodule in ignored_modules: return True - # ignore import failure if guarded by `sys.version_info` test - if isinstance(node.parent, astroid.If) and isinstance( - node.parent.test, astroid.Compare - ): - value = node.parent.test.left - if isinstance(value, astroid.Subscript): - value = value.value - if ( - isinstance(value, astroid.Attribute) - and value.as_string() == "sys.version_info" - ): - 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) @@ -556,25 +549,30 @@ class ImportsChecker(DeprecatedMixin, BaseChecker): self._add_imported_module(node, imported_module.name) @check_messages(*MSGS) - def leave_module(self, node): + def leave_module(self, node: astroid.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() # set for 'import x' style - met_from = set() # set for 'from x import y' style + 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 - if isinstance(import_node, astroid.node_classes.ImportFrom): + if isinstance(import_node, astroid.ImportFrom): met = met_from else: met = met_import package, _, _ = import_name.partition(".") - if current_package and current_package != package and package in met: + 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) |