diff --git a/pylint/checkers/async.py b/pylint/checkers/async.py index a470cde17e..b06ec60c81 100644 --- a/pylint/checkers/async.py +++ b/pylint/checkers/async.py @@ -10,7 +10,7 @@ from typing import TYPE_CHECKING import astroid -from astroid import nodes +from astroid import nodes, util from pylint import checkers from pylint.checkers import utils as checker_utils @@ -55,7 +55,7 @@ def visit_asyncfunctiondef(self, node: nodes.AsyncFunctionDef) -> None: def visit_asyncwith(self, node: nodes.AsyncWith) -> None: for ctx_mgr, _ in node.items: inferred = checker_utils.safe_infer(ctx_mgr) - if inferred is None or inferred is astroid.Uninferable: + if inferred is None or isinstance(inferred, util.UninferableBase): continue if isinstance(inferred, nodes.AsyncFunctionDef): diff --git a/pylint/checkers/base/basic_checker.py b/pylint/checkers/base/basic_checker.py index 2a657af777..08d582b7fb 100644 --- a/pylint/checkers/base/basic_checker.py +++ b/pylint/checkers/base/basic_checker.py @@ -13,7 +13,7 @@ from typing import TYPE_CHECKING, cast import astroid -from astroid import nodes, objects +from astroid import nodes, objects, util from pylint import utils as lint_utils from pylint.checkers import BaseChecker, utils @@ -333,7 +333,9 @@ def _check_using_constant_test( maybe_generator_call = None if not isinstance(test, except_nodes): inferred = utils.safe_infer(test) - if inferred is astroid.Uninferable and isinstance(test, nodes.Name): + if isinstance(inferred, util.UninferableBase) and isinstance( + test, nodes.Name + ): emit, maybe_generator_call = BasicChecker._name_holds_generator(test) # Emit if calling a function that only returns GeneratorExp (always tests True) @@ -677,7 +679,7 @@ def _check_misplaced_format_function(self, call_node: nodes.Call) -> None: return expr = utils.safe_infer(call_node.func.expr) - if expr is astroid.Uninferable: + if isinstance(expr, util.UninferableBase): return if not expr: # we are doubtful on inferred type of node, so here just check if format @@ -822,7 +824,7 @@ def _check_reversed(self, node: nodes.Call) -> None: except utils.NoSuchArgumentError: pass else: - if argument is astroid.Uninferable: + if isinstance(argument, util.UninferableBase): return if argument is None: # Nothing was inferred. diff --git a/pylint/checkers/classes/class_checker.py b/pylint/checkers/classes/class_checker.py index f4fc2a42ac..bf0ab8ba6c 100644 --- a/pylint/checkers/classes/class_checker.py +++ b/pylint/checkers/classes/class_checker.py @@ -15,7 +15,7 @@ from typing import TYPE_CHECKING, Any, Union import astroid -from astroid import bases, nodes +from astroid import bases, nodes, util from astroid.nodes import LocalsDictNodeNG from astroid.typing import SuccessfulInferenceResult @@ -459,7 +459,7 @@ def _is_attribute_property(name: str, klass: nodes.ClassDef) -> bool: return False property_name = "builtins.property" for attr in attributes: - if attr is astroid.Uninferable: + if isinstance(attr, util.UninferableBase): continue try: inferred = next(attr.infer()) @@ -1453,7 +1453,7 @@ def _check_slots(self, node: nodes.ClassDef) -> None: for slots in node.ilookup("__slots__"): # check if __slots__ is a valid type - if slots is astroid.Uninferable: + if isinstance(slots, util.UninferableBase): continue if not is_iterable(slots) and not is_comprehension(slots): self.add_message("invalid-slots", node=node) @@ -1471,7 +1471,7 @@ def _check_slots(self, node: nodes.ClassDef) -> None: values = [item[0] for item in slots.items] else: values = slots.itered() - if values is astroid.Uninferable: + if isinstance(values, util.UninferableBase): continue for elt in values: try: @@ -1518,7 +1518,7 @@ def _check_slots_elt( self, elt: SuccessfulInferenceResult, node: nodes.ClassDef ) -> None: for inferred in elt.infer(): - if inferred is astroid.Uninferable: + if isinstance(inferred, util.UninferableBase): continue if not isinstance(inferred, nodes.Const) or not isinstance( inferred.value, str @@ -1623,8 +1623,7 @@ def _check_invalid_class_object(self, node: nodes.AssignAttr) -> None: else: inferred = safe_infer(node.parent.value) if ( - isinstance(inferred, nodes.ClassDef) - or inferred is astroid.Uninferable + isinstance(inferred, (nodes.ClassDef, util.UninferableBase)) or inferred is None ): # If is uninferable, we allow it to prevent false positives @@ -2133,7 +2132,7 @@ def _check_init(self, node: nodes.FunctionDef, klass_node: nodes.ClassDef) -> No # pylint: disable = too-many-try-statements try: for klass in expr.expr.infer(): - if klass is astroid.Uninferable: + if isinstance(klass, util.UninferableBase): continue # The inferred klass can be super(), which was # assigned to a variable and the `__init__` diff --git a/pylint/checkers/classes/special_methods_checker.py b/pylint/checkers/classes/special_methods_checker.py index fe69062650..9de5e619f7 100644 --- a/pylint/checkers/classes/special_methods_checker.py +++ b/pylint/checkers/classes/special_methods_checker.py @@ -9,7 +9,7 @@ from collections.abc import Callable import astroid -from astroid import bases, nodes +from astroid import bases, nodes, util from astroid.context import InferenceContext from astroid.typing import InferenceResult @@ -394,7 +394,7 @@ def _check_getnewargs_ex( if isinstance(arg, nodes.Call): arg = safe_infer(arg) - if arg and arg is not astroid.Uninferable: + if arg and not isinstance(arg, util.UninferableBase): if not check(arg): found_error = True break diff --git a/pylint/checkers/dunder_methods.py b/pylint/checkers/dunder_methods.py index 987e539aab..b668449013 100644 --- a/pylint/checkers/dunder_methods.py +++ b/pylint/checkers/dunder_methods.py @@ -6,7 +6,8 @@ from typing import TYPE_CHECKING -from astroid import Instance, Uninferable, nodes +from astroid import Instance, nodes +from astroid.util import UninferableBase from pylint.checkers import BaseChecker from pylint.checkers.utils import safe_infer @@ -77,7 +78,9 @@ def visit_call(self, node: nodes.Call) -> None: ) ): inf_expr = safe_infer(node.func.expr) - if not (inf_expr in {None, Uninferable} or isinstance(inf_expr, Instance)): + if not ( + inf_expr is None or isinstance(inf_expr, (Instance, UninferableBase)) + ): # Skip dunder calls to non instantiated classes. return diff --git a/pylint/checkers/exceptions.py b/pylint/checkers/exceptions.py index 67735b3536..c2bd246d7f 100644 --- a/pylint/checkers/exceptions.py +++ b/pylint/checkers/exceptions.py @@ -13,7 +13,7 @@ from typing import TYPE_CHECKING, Any import astroid -from astroid import nodes, objects +from astroid import nodes, objects, util from astroid.context import InferenceContext from astroid.typing import InferenceResult, SuccessfulInferenceResult @@ -46,11 +46,11 @@ def _annotated_unpack_infer( if isinstance(stmt, (nodes.List, nodes.Tuple)): for elt in stmt.elts: inferred = utils.safe_infer(elt) - if inferred and inferred is not astroid.Uninferable: + if inferred and not isinstance(inferred, util.UninferableBase): yield elt, inferred return for inferred in stmt.infer(context): - if inferred is astroid.Uninferable: + if isinstance(inferred, util.UninferableBase): continue yield stmt, inferred @@ -344,7 +344,7 @@ def visit_raise(self, node: nodes.Raise) -> None: ExceptionRaiseRefVisitor(self, node).visit(expr) inferred = utils.safe_infer(expr) - if inferred is None or inferred is astroid.Uninferable: + if inferred is None or isinstance(inferred, util.UninferableBase): return ExceptionRaiseLeafVisitor(self, node).visit(inferred) @@ -375,7 +375,7 @@ def _check_bad_exception_cause(self, node: nodes.Raise) -> None: An exception cause can be only `None` or an exception. """ cause = utils.safe_infer(node.cause) - if cause in (astroid.Uninferable, None): + if cause is None or isinstance(cause, util.UninferableBase): return if isinstance(cause, nodes.Const): @@ -441,7 +441,7 @@ def _check_catching_non_exception( if isinstance(exc, nodes.Tuple): # Check if it is a tuple of exceptions. inferred = [utils.safe_infer(elt) for elt in exc.elts] - if any(node is astroid.Uninferable for node in inferred): + if any(isinstance(node, util.UninferableBase) for node in inferred): # Don't emit if we don't know every component. return if all( diff --git a/pylint/checkers/refactoring/implicit_booleaness_checker.py b/pylint/checkers/refactoring/implicit_booleaness_checker.py index 2ad038619b..73503f8e65 100644 --- a/pylint/checkers/refactoring/implicit_booleaness_checker.py +++ b/pylint/checkers/refactoring/implicit_booleaness_checker.py @@ -5,7 +5,7 @@ from __future__ import annotations import astroid -from astroid import bases, nodes +from astroid import bases, nodes, util from pylint import checkers from pylint.checkers import utils @@ -224,7 +224,9 @@ def _implicit_booleaness_message_args( return original_comparison, suggestion, description @staticmethod - def base_names_of_instance(node: bases.Uninferable | bases.Instance) -> list[str]: + def base_names_of_instance( + node: util.UninferableBase | bases.Instance, + ) -> list[str]: """Return all names inherited by a class instance or those returned by a function. diff --git a/pylint/checkers/refactoring/refactoring_checker.py b/pylint/checkers/refactoring/refactoring_checker.py index b3e48f31ef..26877ccdb7 100644 --- a/pylint/checkers/refactoring/refactoring_checker.py +++ b/pylint/checkers/refactoring/refactoring_checker.py @@ -16,7 +16,7 @@ import astroid from astroid import bases, nodes -from astroid.util import Uninferable +from astroid.util import UninferableBase from pylint import checkers from pylint.checkers import utils @@ -1542,7 +1542,9 @@ def visit_return(self, node: nodes.Return | nodes.Assign) -> None: return inferred_truth_value = utils.safe_infer(truth_value, compare_constants=True) - if inferred_truth_value is None or inferred_truth_value == astroid.Uninferable: + if inferred_truth_value is None or isinstance( + inferred_truth_value, UninferableBase + ): return truth_boolean_value = inferred_truth_value.bool_value() @@ -1569,7 +1571,7 @@ def _append_context_managers_to_stack(self, node: nodes.Assign) -> None: else: assignees = [node.targets[0]] values = [node.value] - if Uninferable in (assignees, values): + if any(isinstance(n, UninferableBase) for n in (assignees, values)): return for assignee, value in zip(assignees, values): if not isinstance(value, nodes.Call): @@ -1921,7 +1923,11 @@ def _is_raise_node_return_ended(self, node: nodes.Raise) -> bool: # to infer it. return True exc = utils.safe_infer(node.exc) - if exc is None or exc is astroid.Uninferable or not hasattr(exc, "pytype"): + if ( + exc is None + or isinstance(exc, UninferableBase) + or not hasattr(exc, "pytype") + ): return False exc_name = exc.pytype().split(".")[-1] handlers = utils.get_exception_handlers(node, exc_name) diff --git a/pylint/checkers/stdlib.py b/pylint/checkers/stdlib.py index e46b5f5744..96b273c741 100644 --- a/pylint/checkers/stdlib.py +++ b/pylint/checkers/stdlib.py @@ -11,7 +11,7 @@ from typing import TYPE_CHECKING, Any, Dict, Set, Tuple import astroid -from astroid import nodes +from astroid import nodes, util from astroid.typing import InferenceResult from pylint import interfaces @@ -540,7 +540,7 @@ def visit_call(self, node: nodes.Call) -> None: """Visit a Call node.""" self.check_deprecated_class_in_call(node) for inferred in utils.infer_all(node.func): - if inferred is astroid.Uninferable: + if isinstance(inferred, util.UninferableBase): continue if inferred.root().name in OPEN_MODULE: open_func_name: str | None = None @@ -805,7 +805,7 @@ def _check_invalid_envvar_value( call_arg: InferenceResult | None, allow_none: bool, ) -> None: - if call_arg in (astroid.Uninferable, None): + if call_arg is None or isinstance(call_arg, util.UninferableBase): return name = infer.qname() @@ -818,7 +818,7 @@ def _check_invalid_envvar_value( if emit: self.add_message(message, node=node, args=(name, call_arg.pytype())) else: - self.add_message(message, node=node, args=(name, call_arg.pytype())) # type: ignore[union-attr] + self.add_message(message, node=node, args=(name, call_arg.pytype())) def deprecated_methods(self) -> set[str]: return self._deprecated_methods diff --git a/pylint/checkers/strings.py b/pylint/checkers/strings.py index d5be5aa531..380d87fb02 100644 --- a/pylint/checkers/strings.py +++ b/pylint/checkers/strings.py @@ -15,7 +15,7 @@ from typing import TYPE_CHECKING import astroid -from astroid import bases, nodes +from astroid import bases, nodes, util from astroid.typing import SuccessfulInferenceResult from pylint.checkers import BaseChecker, BaseRawFileChecker, BaseTokenChecker, utils @@ -337,7 +337,7 @@ def visit_binop(self, node: nodes.BinOp) -> None: if ( format_type is not None and arg_type - and arg_type != astroid.Uninferable + and not isinstance(arg_type, util.UninferableBase) and not arg_matches_format_type(arg_type, format_type) ): self.add_message( @@ -395,7 +395,7 @@ def visit_binop(self, node: nodes.BinOp) -> None: arg_type = utils.safe_infer(arg) if ( arg_type - and arg_type != astroid.Uninferable + and not isinstance(arg_type, util.UninferableBase) and not arg_matches_format_type(arg_type, format_type) ): self.add_message( @@ -561,7 +561,7 @@ def _check_new_format_specifiers( if key not in named: continue argname = named[key] - if argname in (astroid.Uninferable, None): + if argname is None or isinstance(argname, util.UninferableBase): continue try: argument = utils.safe_infer(argname) @@ -578,7 +578,7 @@ def _check_new_format_specifiers( previous = argument parsed: list[tuple[bool, str]] = [] for is_attribute, specifier in specifiers: - if previous is astroid.Uninferable: + if isinstance(previous, util.UninferableBase): break parsed.append((is_attribute, specifier)) if is_attribute: @@ -611,7 +611,7 @@ def _check_new_format_specifiers( warn_error = True except astroid.InferenceError: break - if previous is astroid.Uninferable: + if isinstance(previous, util.UninferableBase): break else: try: diff --git a/pylint/checkers/typecheck.py b/pylint/checkers/typecheck.py index e401134735..8e00384d7c 100644 --- a/pylint/checkers/typecheck.py +++ b/pylint/checkers/typecheck.py @@ -21,7 +21,7 @@ import astroid import astroid.exceptions import astroid.helpers -from astroid import arguments, bases, nodes +from astroid import arguments, bases, nodes, util from astroid.typing import InferenceResult, SuccessfulInferenceResult from pylint.checkers import BaseChecker, utils @@ -1079,7 +1079,7 @@ def visit_attribute( non_opaque_inference_results: list[SuccessfulInferenceResult] = [ owner for owner in inferred - if owner is not astroid.Uninferable and not isinstance(owner, nodes.Unknown) + if not isinstance(owner, (nodes.Unknown, util.UninferableBase)) ] if ( len(non_opaque_inference_results) != len(inferred) @@ -1316,11 +1316,7 @@ def _check_uninferable_call(self, node: nodes.Call) -> None: expr = node.func.expr klass = safe_infer(expr) - if ( - klass is None - or klass is astroid.Uninferable - or not isinstance(klass, astroid.Instance) - ): + if not isinstance(klass, astroid.Instance): return try: @@ -1329,8 +1325,6 @@ def _check_uninferable_call(self, node: nodes.Call) -> None: return for attr in attrs: - if attr is astroid.Uninferable: - continue if not isinstance(attr, nodes.FunctionDef): continue @@ -1343,7 +1337,8 @@ def _check_uninferable_call(self, node: nodes.Call) -> None: continue if all( - return_node is astroid.Uninferable for return_node in call_results + isinstance(return_node, util.UninferableBase) + for return_node in call_results ): # We were unable to infer return values of the call, skipping continue @@ -1694,7 +1689,7 @@ def _check_invalid_sequence_index(self, subscript: nodes.Subscript) -> None: # that override __getitem__ and which may allow non-integer indices. try: methods = astroid.interpreter.dunder_lookup.lookup(parent_type, methodname) - if methods is astroid.Uninferable: + if isinstance(methods, util.UninferableBase): return None itemmethod = methods[0] except ( @@ -1711,7 +1706,7 @@ def _check_invalid_sequence_index(self, subscript: nodes.Subscript) -> None: return None index_type = safe_infer(subscript.slice) - if index_type is None or index_type is astroid.Uninferable: + if index_type is None or isinstance(index_type, util.UninferableBase): return None # Constants must be of type int if isinstance(index_type, nodes.Const): @@ -1775,7 +1770,7 @@ def _check_invalid_slice_index(self, node: nodes.Slice) -> None: continue index_type = safe_infer(index) - if index_type is None or index_type is astroid.Uninferable: + if index_type is None or isinstance(index_type, util.UninferableBase): continue # Constants must be of type int or None @@ -1807,7 +1802,7 @@ def _check_invalid_slice_index(self, node: nodes.Slice) -> None: parent = node.parent if isinstance(parent, nodes.Subscript): inferred = safe_infer(parent.value) - if inferred is None or inferred is astroid.Uninferable: + if inferred is None or isinstance(inferred, util.UninferableBase): # Don't know what this is return known_objects = ( @@ -1836,7 +1831,7 @@ def visit_with(self, node: nodes.With) -> None: for ctx_mgr, _ in node.items: context = astroid.context.InferenceContext() inferred = safe_infer(ctx_mgr, context=context) - if inferred is None or inferred is astroid.Uninferable: + if inferred is None or isinstance(inferred, util.UninferableBase): continue if isinstance(inferred, astroid.bases.Generator): @@ -2041,7 +2036,7 @@ def _check_membership_test(self, node: nodes.NodeNG) -> None: if is_comprehension(node): return inferred = safe_infer(node) - if inferred is None or inferred is astroid.Uninferable: + if inferred is None or isinstance(inferred, util.UninferableBase): return if not supports_membership_test(inferred): self.add_message( @@ -2124,7 +2119,7 @@ def visit_subscript(self, node: nodes.Subscript) -> None: inferred = safe_infer(node.value) - if inferred is None or inferred is astroid.Uninferable: + if inferred is None or isinstance(inferred, util.UninferableBase): return if getattr(inferred, "decorators", None): @@ -2247,7 +2242,7 @@ def _check_mapping(self, node: nodes.NodeNG) -> None: if isinstance(node, nodes.DictComp): return inferred = safe_infer(node) - if inferred is None or inferred is astroid.Uninferable: + if inferred is None or isinstance(inferred, util.UninferableBase): return if not is_mapping(inferred): self.add_message("not-a-mapping", args=node.as_string(), node=node) diff --git a/pylint/checkers/utils.py b/pylint/checkers/utils.py index 6c35dc65fc..9f1ce93fed 100644 --- a/pylint/checkers/utils.py +++ b/pylint/checkers/utils.py @@ -21,7 +21,7 @@ import _string import astroid.objects -from astroid import TooManyLevelsError, nodes +from astroid import TooManyLevelsError, nodes, util from astroid.context import InferenceContext from astroid.exceptions import AstroidError from astroid.nodes._base_nodes import ImportNode @@ -885,7 +885,7 @@ def decorated_with( if any( i.name in qnames or i.qname() in qnames for i in decorator_node.infer() - if i is not None and i != astroid.Uninferable + if i is not None and not isinstance(i, util.UninferableBase) ): return True except astroid.InferenceError: @@ -936,11 +936,10 @@ def uninferable_final_decorators( decorator, "attrname", None ) == "final" - if (is_from_import or is_import) and safe_infer(decorator) in [ - astroid.Uninferable, - None, - ]: - decorators.append(decorator) + if is_from_import or is_import: + inferred = safe_infer(decorator) + if inferred is None or isinstance(inferred, util.UninferableBase): + decorators.append(decorator) return decorators @@ -1373,7 +1372,7 @@ def safe_infer( except Exception as e: # pragma: no cover raise AstroidError from e - if value is not astroid.Uninferable: + if not isinstance(value, util.UninferableBase): inferred_types.add(_get_python_type_of_node(value)) # pylint: disable = too-many-try-statements @@ -1458,7 +1457,7 @@ def node_type(node: nodes.NodeNG) -> SuccessfulInferenceResult | None: types: set[SuccessfulInferenceResult] = set() try: for var_type in node.infer(): - if var_type == astroid.Uninferable or is_none(var_type): + if isinstance(var_type, util.UninferableBase) or is_none(var_type): continue types.add(var_type) if len(types) > 1: @@ -2058,7 +2057,7 @@ def is_hashable(node: nodes.NodeNG) -> bool: # pylint: disable = too-many-try-statements try: for inferred in node.infer(): - if inferred is astroid.Uninferable or isinstance(inferred, nodes.ClassDef): + if isinstance(inferred, (nodes.ClassDef, util.UninferableBase)): return True if not hasattr(inferred, "igetattr"): return True diff --git a/pylint/checkers/variables.py b/pylint/checkers/variables.py index bc4f887dc6..734231103b 100644 --- a/pylint/checkers/variables.py +++ b/pylint/checkers/variables.py @@ -19,7 +19,7 @@ from typing import TYPE_CHECKING, Any, NamedTuple import astroid -from astroid import bases, extract_node, nodes +from astroid import bases, extract_node, nodes, util from astroid.nodes import _base_nodes from astroid.typing import InferenceResult @@ -2866,7 +2866,7 @@ def _check_unpacking( return if utils.is_comprehension(node): return - if inferred is astroid.Uninferable: + if isinstance(inferred, util.UninferableBase): return if ( isinstance(inferred.parent, nodes.Arguments) @@ -2969,7 +2969,7 @@ def _check_all( self, node: nodes.Module, not_consumed: dict[str, list[nodes.NodeNG]] ) -> None: assigned = next(node.igetattr("__all__")) - if assigned is astroid.Uninferable: + if isinstance(assigned, util.UninferableBase): return if assigned.pytype() not in {"builtins.list", "builtins.tuple"}: line, col = assigned.tolineno, assigned.col_offset @@ -2980,7 +2980,7 @@ def _check_all( elt_name = next(elt.infer()) except astroid.InferenceError: continue - if elt_name is astroid.Uninferable: + if isinstance(elt_name, util.UninferableBase): continue if not elt_name.parent: continue diff --git a/pylint/extensions/_check_docs_utils.py b/pylint/extensions/_check_docs_utils.py index 811bd67b57..33edc95e9a 100644 --- a/pylint/extensions/_check_docs_utils.py +++ b/pylint/extensions/_check_docs_utils.py @@ -10,7 +10,7 @@ import astroid from astroid import nodes -from astroid.util import Uninferable +from astroid.util import UninferableBase from pylint.checkers import utils @@ -89,7 +89,7 @@ def returns_something(return_node: nodes.Return) -> bool: return not (isinstance(returns, nodes.Const) and returns.value is None) -def _get_raise_target(node: nodes.NodeNG) -> nodes.NodeNG | Uninferable | None: +def _get_raise_target(node: nodes.NodeNG) -> nodes.NodeNG | UninferableBase | None: if isinstance(node.exc, nodes.Call): func = node.exc.func if isinstance(func, (nodes.Name, nodes.Attribute)): @@ -126,7 +126,7 @@ def possible_exc_types(node: nodes.NodeNG) -> set[nodes.ClassDef]: if handler and handler.type: try: for exception in astroid.unpack_infer(handler.type): - if exception is not astroid.Uninferable: + if not isinstance(exception, UninferableBase): exceptions.append(exception) except astroid.InferenceError: pass diff --git a/pylint/extensions/overlapping_exceptions.py b/pylint/extensions/overlapping_exceptions.py index 22af25bc38..93d225137e 100644 --- a/pylint/extensions/overlapping_exceptions.py +++ b/pylint/extensions/overlapping_exceptions.py @@ -9,7 +9,7 @@ from typing import TYPE_CHECKING, Any import astroid -from astroid import nodes +from astroid import nodes, util from pylint import checkers from pylint.checkers import utils @@ -51,7 +51,7 @@ def visit_tryexcept(self, node: nodes.TryExcept) -> None: handled_in_clause: list[tuple[Any, Any]] = [] for part, exc in excs: - if exc is astroid.Uninferable: + if isinstance(exc, util.UninferableBase): continue if isinstance(exc, astroid.Instance) and utils.inherit_from_std_ex(exc): exc = exc._proxied diff --git a/pylint/pyreverse/diagrams.py b/pylint/pyreverse/diagrams.py index c3bf8e0f01..4437d3c4e0 100644 --- a/pylint/pyreverse/diagrams.py +++ b/pylint/pyreverse/diagrams.py @@ -10,7 +10,7 @@ from typing import Any import astroid -from astroid import nodes +from astroid import nodes, util from pylint.checkers.utils import decorated_with_property from pylint.pyreverse.utils import FilterMixIn, is_interface @@ -233,7 +233,7 @@ def extract_relationships(self) -> None: def assign_association_relationship( self, value: astroid.NodeNG, obj: ClassEntity, name: str, type_relationship: str ) -> None: - if value is astroid.Uninferable: + if isinstance(value, util.UninferableBase): return if isinstance(value, astroid.Instance): value = value._proxied diff --git a/pylint/pyreverse/inspector.py b/pylint/pyreverse/inspector.py index cf22d7eb15..523ff81716 100644 --- a/pylint/pyreverse/inspector.py +++ b/pylint/pyreverse/inspector.py @@ -18,7 +18,7 @@ from typing import Any, Callable, Optional import astroid -from astroid import nodes +from astroid import nodes, util from pylint import constants from pylint.pyreverse import utils @@ -50,7 +50,7 @@ def interfaces(node: nodes.ClassDef) -> Generator[Any, None, None]: found = set() missing = False for iface in nodes.unpack_infer(implements): - if iface is astroid.Uninferable: + if isinstance(iface, util.UninferableBase): missing = True continue if iface not in found: