diff options
author | Pierre Sassoulas <pierre.sassoulas@gmail.com> | 2021-03-27 15:21:29 +0100 |
---|---|---|
committer | Pierre Sassoulas <pierre.sassoulas@gmail.com> | 2021-03-28 16:30:10 +0200 |
commit | 14f20e2d50b71d92893edda67c00054a840ee05f (patch) | |
tree | 35b161bc220c74578068f1392458bc4ef9c475f4 | |
parent | d2db40c08433ca35dc9e5312e1d1b6404db65c33 (diff) | |
download | pylint-git-14f20e2d50b71d92893edda67c00054a840ee05f.tar.gz |
Import astroid with import x or from x import y but not both
Remove unused imports for astroid
-rw-r--r-- | doc/how_tos/transform_plugins.rst | 3 | ||||
-rw-r--r-- | pylint/checkers/async.py | 5 | ||||
-rw-r--r-- | pylint/checkers/base.py | 5 | ||||
-rw-r--r-- | pylint/checkers/classes.py | 30 | ||||
-rw-r--r-- | pylint/checkers/design_analysis.py | 11 | ||||
-rw-r--r-- | pylint/checkers/exceptions.py | 5 | ||||
-rw-r--r-- | pylint/checkers/imports.py | 12 | ||||
-rw-r--r-- | pylint/checkers/python3.py | 9 | ||||
-rw-r--r-- | pylint/checkers/refactoring/len_checker.py | 8 | ||||
-rw-r--r-- | pylint/checkers/refactoring/refactoring_checker.py | 3 | ||||
-rw-r--r-- | pylint/checkers/stdlib.py | 9 | ||||
-rw-r--r-- | pylint/checkers/strings.py | 8 | ||||
-rw-r--r-- | pylint/checkers/typecheck.py | 46 | ||||
-rw-r--r-- | pylint/checkers/utils.py | 15 | ||||
-rw-r--r-- | pylint/checkers/variables.py | 14 | ||||
-rw-r--r-- | pylint/constants.py | 6 | ||||
-rw-r--r-- | pylint/lint/pylinter.py | 15 | ||||
-rw-r--r-- | pylint/utils/utils.py | 1 | ||||
-rw-r--r-- | tests/unittest_pyreverse_inspector.py | 7 |
19 files changed, 102 insertions, 110 deletions
diff --git a/doc/how_tos/transform_plugins.rst b/doc/how_tos/transform_plugins.rst index e376e5345..d62f6e70a 100644 --- a/doc/how_tos/transform_plugins.rst +++ b/doc/how_tos/transform_plugins.rst @@ -67,7 +67,6 @@ Module, Class, Function etc. In our case we need to transform a class. It can be .. sourcecode:: python import astroid - from astroid import MANAGER def register(linter): # Needed for registering the plugin. @@ -79,7 +78,7 @@ Module, Class, Function etc. In our case we need to transform a class. It can be for f in warnings.WarningMessage._WARNING_DETAILS: cls.locals[f] = [astroid.ClassDef(f, None)] - MANAGER.register_transform(astroid.ClassDef, transform) + astroid.MANAGER.register_transform(astroid.ClassDef, transform) Let's go through the plugin. First, we need to register a class transform, which is done via the ``register_transform`` function in ``MANAGER``. It takes the node diff --git a/pylint/checkers/async.py b/pylint/checkers/async.py index 089c8f5b2..9fde4f551 100644 --- a/pylint/checkers/async.py +++ b/pylint/checkers/async.py @@ -11,7 +11,6 @@ import sys import astroid -from astroid import bases, exceptions from pylint import checkers, interfaces, utils from pylint.checkers import utils as checker_utils @@ -64,7 +63,7 @@ class AsyncChecker(checkers.BaseChecker): # with contextlib.asynccontextmanager. if decorated_with(inferred, self._async_generators): continue - elif isinstance(inferred, bases.AsyncGenerator): + elif isinstance(inferred, astroid.bases.AsyncGenerator): # Check if we are dealing with a function decorated # with contextlib.asynccontextmanager. if decorated_with(inferred.parent, self._async_generators): @@ -73,7 +72,7 @@ class AsyncChecker(checkers.BaseChecker): try: inferred.getattr("__aenter__") inferred.getattr("__aexit__") - except exceptions.NotFoundError: + except astroid.exceptions.NotFoundError: if isinstance(inferred, astroid.Instance): # If we do not know the bases of this class, # just skip it. diff --git a/pylint/checkers/base.py b/pylint/checkers/base.py index b9dde439b..18dca945e 100644 --- a/pylint/checkers/base.py +++ b/pylint/checkers/base.py @@ -65,9 +65,6 @@ import sys from typing import Pattern import astroid -import astroid.bases -import astroid.scoped_nodes -from astroid.arguments import CallSite from pylint import checkers, exceptions, interfaces from pylint import utils as lint_utils @@ -1269,7 +1266,7 @@ class BasicChecker(_BasicChecker): # return something else (but we don't check that, yet). return - call_site = CallSite.from_call(call) + call_site = astroid.arguments.CallSite.from_call(call) ordinary_args = list(node.args.args) new_call_args = list(self._filter_vararg(node, call.args)) if node.args.kwarg: diff --git a/pylint/checkers/classes.py b/pylint/checkers/classes.py index c96cce007..0ba382feb 100644 --- a/pylint/checkers/classes.py +++ b/pylint/checkers/classes.py @@ -44,10 +44,6 @@ import collections from itertools import chain, zip_longest import astroid -from astroid import decorators, objects -from astroid.bases import BUILTINS, Generator -from astroid.exceptions import DuplicateBasesError, InconsistentMroError -from astroid.scoped_nodes import function_to_method from pylint.checkers import BaseChecker from pylint.checkers.utils import ( @@ -403,7 +399,7 @@ def _is_attribute_property(name, klass): attributes = klass.getattr(name) except astroid.NotFoundError: return False - property_name = f"{BUILTINS}.property" + property_name = f"{astroid.bases.BUILTINS}.property" for attr in attributes: if attr is astroid.Uninferable: continue @@ -774,11 +770,11 @@ a metaclass class method.", self._first_attrs = [] self._meth_could_be_func = None - @decorators.cachedproperty + @astroid.decorators.cachedproperty def _dummy_rgx(self): return get_global_option(self, "dummy-variables-rgx", default=None) - @decorators.cachedproperty + @astroid.decorators.cachedproperty def _ignore_mixin(self): return get_global_option(self, "ignore-mixin-members", default=True) @@ -811,9 +807,9 @@ a metaclass class method.", """Detect that a class has a consistent mro or duplicate bases.""" try: node.mro() - except InconsistentMroError: + except astroid.InconsistentMroError: self.add_message("inconsistent-mro", args=node.name, node=node) - except DuplicateBasesError: + except astroid.DuplicateBasesError: self.add_message("duplicate-bases", args=node.name, node=node) except NotImplementedError: # Old style class, there's no mro so don't do anything. @@ -829,7 +825,7 @@ a metaclass class method.", if not ancestor: continue if isinstance(ancestor, astroid.Instance) and ancestor.is_subtype_of( - f"{BUILTINS}.type" + f"{astroid.bases.BUILTINS}.type" ): continue @@ -1056,7 +1052,7 @@ a metaclass class method.", except astroid.InferenceError: return else: - if not isinstance(super_call, objects.Super): + if not isinstance(super_call, astroid.objects.Super): return # The name should be the same. @@ -1673,7 +1669,7 @@ a metaclass class method.", and klass._proxied.name == "super" ): return - if isinstance(klass, objects.Super): + if isinstance(klass, astroid.objects.Super): return try: del not_called_yet[klass] @@ -1704,8 +1700,8 @@ a metaclass class method.", return instance = cls.instantiate_class() - method1 = function_to_method(method1, instance) - refmethod = function_to_method(refmethod, instance) + method1 = astroid.scoped_nodes.function_to_method(method1, instance) + refmethod = astroid.scoped_nodes.function_to_method(refmethod, instance) # Don't care about functions with unknown argument (builtins). if method1.args.args is None or refmethod.args.args is None: @@ -1900,7 +1896,7 @@ class SpecialMethodsChecker(BaseChecker): # by no-method-argument. return - if decorated_with(node, [BUILTINS + ".staticmethod"]): + if decorated_with(node, [astroid.bases.BUILTINS + ".staticmethod"]): # We expect to not take in consideration self. all_args = node.args.args else: @@ -1991,8 +1987,8 @@ class SpecialMethodsChecker(BaseChecker): if node is astroid.Uninferable: # Just ignore Uninferable objects. return True - if isinstance(node, Generator): - # Generators can be itered. + if isinstance(node, astroid.bases.Generator): + # Generators can be iterated. return True if isinstance(node, astroid.Instance): diff --git a/pylint/checkers/design_analysis.py b/pylint/checkers/design_analysis.py index 9fc864aca..cf1edca3e 100644 --- a/pylint/checkers/design_analysis.py +++ b/pylint/checkers/design_analysis.py @@ -25,7 +25,6 @@ import re from collections import defaultdict import astroid -from astroid import BoolOp, If, decorators from pylint import utils from pylint.checkers import BaseChecker @@ -137,7 +136,7 @@ def _count_boolean_expressions(bool_op): """ nb_bool_expr = 0 for bool_expr in bool_op.get_children(): - if isinstance(bool_expr, BoolOp): + if isinstance(bool_expr, astroid.BoolOp): nb_bool_expr += _count_boolean_expressions(bool_expr) else: nb_bool_expr += 1 @@ -284,7 +283,7 @@ class MisdesignChecker(BaseChecker): for i in range(len(self._stmts)): self._stmts[i] += amount - @decorators.cachedproperty + @astroid.decorators.cachedproperty def _ignored_argument_names(self): return utils.get_global_option(self, "ignored-argument-names", default=None) @@ -460,7 +459,9 @@ class MisdesignChecker(BaseChecker): self._check_boolean_expressions(node) branches = 1 # don't double count If nodes coming from some 'elif' - if node.orelse and (len(node.orelse) > 1 or not isinstance(node.orelse[0], If)): + if node.orelse and ( + len(node.orelse) > 1 or not isinstance(node.orelse[0], astroid.If) + ): branches += 1 self._inc_branch(node, branches) self._inc_all_stmts(branches) @@ -471,7 +472,7 @@ class MisdesignChecker(BaseChecker): if the "if" node test is a BoolOp node """ condition = node.test - if not isinstance(condition, BoolOp): + if not isinstance(condition, astroid.BoolOp): return nb_bool_expr = _count_boolean_expressions(condition) if nb_bool_expr > self.config.max_bool_expr: diff --git a/pylint/checkers/exceptions.py b/pylint/checkers/exceptions.py index 980dab318..2a59c9511 100644 --- a/pylint/checkers/exceptions.py +++ b/pylint/checkers/exceptions.py @@ -36,7 +36,6 @@ import inspect import typing import astroid -from astroid.node_classes import NodeNG from pylint import checkers, interfaces from pylint.checkers import utils @@ -433,8 +432,8 @@ class ExceptionsChecker(checkers.BaseChecker): def _check_try_except_raise(self, node): def gather_exceptions_from_handler( handler, - ) -> typing.Optional[typing.List[NodeNG]]: - exceptions = [] # type: typing.List[NodeNG] + ) -> typing.Optional[typing.List[astroid.node_classes.NodeNG]]: + exceptions = [] # type: typing.List[astroid.node_classes.NodeNG] if handler.type: exceptions_in_handler = utils.safe_infer(handler.type) if isinstance(exceptions_in_handler, astroid.Tuple): diff --git a/pylint/checkers/imports.py b/pylint/checkers/imports.py index ba14108c4..9d4e60e6f 100644 --- a/pylint/checkers/imports.py +++ b/pylint/checkers/imports.py @@ -46,8 +46,6 @@ import sys from distutils import sysconfig import astroid -from astroid import modutils -from astroid.decorators import cached from pylint.checkers import BaseChecker, DeprecatedMixin from pylint.checkers.utils import ( @@ -810,14 +808,16 @@ class ImportsChecker(DeprecatedMixin, BaseChecker): base = os.path.splitext(os.path.basename(module_file))[0] try: - importedmodname = modutils.get_module_part(importedmodname, module_file) + importedmodname = astroid.modutils.get_module_part( + importedmodname, module_file + ) except ImportError: pass if context_name == importedmodname: self.add_message("import-self", node=node) - elif not modutils.is_standard_module(importedmodname): + elif not astroid.modutils.is_standard_module(importedmodname): # if this is not a package __init__ module if base != "__init__" and context_name not in self._module_pkg: # record the module's parent, or the module itself if this is @@ -921,14 +921,14 @@ class ImportsChecker(DeprecatedMixin, BaseChecker): graph[importee].add(importer) return graph - @cached + @astroid.decorators.cached def _external_dependencies_info(self): """return cached external dependencies information or build and cache them """ return self._filter_dependencies_graph(internal=False) - @cached + @astroid.decorators.cached def _internal_dependencies_info(self): """return cached internal dependencies information or build and cache them diff --git a/pylint/checkers/python3.py b/pylint/checkers/python3.py index d3943ad37..fdc6590b0 100644 --- a/pylint/checkers/python3.py +++ b/pylint/checkers/python3.py @@ -43,7 +43,6 @@ import tokenize from collections import namedtuple import astroid -from astroid import bases from pylint import checkers, interfaces from pylint.checkers import utils @@ -978,7 +977,9 @@ class Python3Checker(checkers.BaseChecker): # classmethod 1 argument should cause a failure, if it is a # staticmethod 0 arguments should cause a failure. failing_arg_count = 1 - if utils.decorated_with(node, [bases.BUILTINS + ".staticmethod"]): + if utils.decorated_with( + node, [astroid.bases.BUILTINS + ".staticmethod"] + ): failing_arg_count = 0 if len(node.args.args) == failing_arg_count: self.add_message("next-method-defined", node=node) @@ -1116,7 +1117,7 @@ class Python3Checker(checkers.BaseChecker): if not inferred: return - builtins_list = f"{bases.BUILTINS}.list" + builtins_list = f"{astroid.bases.BUILTINS}.list" if isinstance(inferred, astroid.List) or inferred.qname() == builtins_list: kwargs = node.keywords @@ -1125,7 +1126,7 @@ class Python3Checker(checkers.BaseChecker): if not inferred: return - builtins_sorted = f"{bases.BUILTINS}.sorted" + builtins_sorted = f"{astroid.bases.BUILTINS}.sorted" if inferred.qname() == builtins_sorted: kwargs = node.keywords diff --git a/pylint/checkers/refactoring/len_checker.py b/pylint/checkers/refactoring/len_checker.py index c11d74b30..a5897915c 100644 --- a/pylint/checkers/refactoring/len_checker.py +++ b/pylint/checkers/refactoring/len_checker.py @@ -3,7 +3,6 @@ from typing import List import astroid -from astroid import DictComp, GeneratorExp, ListComp, SetComp from pylint import checkers, interfaces from pylint.checkers import utils @@ -68,7 +67,12 @@ class LenChecker(checkers.BaseChecker): if not utils.is_test_condition(node, parent): return len_arg = node.args[0] - generator_or_comprehension = (ListComp, SetComp, DictComp, GeneratorExp) + generator_or_comprehension = ( + astroid.ListComp, + astroid.SetComp, + astroid.DictComp, + astroid.GeneratorExp, + ) if isinstance(len_arg, generator_or_comprehension): # The node is a generator or comprehension as in len([x for x in ...]) self.add_message("len-as-condition", node=node) diff --git a/pylint/checkers/refactoring/refactoring_checker.py b/pylint/checkers/refactoring/refactoring_checker.py index c22e26163..a84b995e2 100644 --- a/pylint/checkers/refactoring/refactoring_checker.py +++ b/pylint/checkers/refactoring/refactoring_checker.py @@ -9,7 +9,6 @@ from functools import reduce from typing import List import astroid -from astroid import decorators from pylint import checkers, interfaces from pylint import utils as lint_utils @@ -335,7 +334,7 @@ class RefactoringChecker(checkers.BaseTokenChecker): # do this in open since config not fully initialized in __init__ self._never_returning_functions = set(self.config.never_returning_functions) - @decorators.cachedproperty + @astroid.decorators.cachedproperty def _dummy_rgx(self): return lint_utils.get_global_option(self, "dummy-variables-rgx", default=None) diff --git a/pylint/checkers/stdlib.py b/pylint/checkers/stdlib.py index fe5b30c18..ce5ec09a1 100644 --- a/pylint/checkers/stdlib.py +++ b/pylint/checkers/stdlib.py @@ -36,8 +36,6 @@ import sys import astroid -from astroid.bases import Instance -from astroid.node_classes import Const from pylint.checkers import BaseChecker, DeprecatedMixin, utils from pylint.interfaces import IAstroidChecker @@ -382,7 +380,10 @@ class StdlibChecker(DeprecatedMixin, BaseChecker): inferred = next(node.infer()) except astroid.InferenceError: return - if isinstance(inferred, Instance) and inferred.qname() == "datetime.time": + if ( + isinstance(inferred, astroid.Instance) + and inferred.qname() == "datetime.time" + ): self.add_message("boolean-datetime", node=node) def _check_open_mode(self, node): @@ -442,7 +443,7 @@ class StdlibChecker(DeprecatedMixin, BaseChecker): return name = infer.qname() - if isinstance(call_arg, Const): + if isinstance(call_arg, astroid.Const): emit = False if call_arg.value is None: emit = not allow_none diff --git a/pylint/checkers/strings.py b/pylint/checkers/strings.py index d82efacc4..0b36bc7e0 100644 --- a/pylint/checkers/strings.py +++ b/pylint/checkers/strings.py @@ -41,8 +41,6 @@ import typing from typing import Iterable import astroid -from astroid.arguments import CallSite -from astroid.node_classes import Const from pylint.checkers import BaseChecker, BaseTokenChecker, utils from pylint.checkers.utils import check_messages @@ -467,7 +465,7 @@ class StringFormatChecker(BaseChecker): if not (isinstance(strnode, astroid.Const) and isinstance(strnode.value, str)): return try: - call_site = CallSite.from_call(node) + call_site = astroid.arguments.CallSite.from_call(node) except astroid.InferenceError: return @@ -776,7 +774,9 @@ class StringConstantChecker(BaseTokenChecker): def check_for_concatenated_strings(self, elements, iterable_type): for elt in elements: - if not (isinstance(elt, Const) and elt.pytype() in _AST_NODE_STR_TYPES): + if not ( + isinstance(elt, astroid.Const) and elt.pytype() in _AST_NODE_STR_TYPES + ): continue if elt.col_offset < 0: # This can happen in case of escaped newlines diff --git a/pylint/checkers/typecheck.py b/pylint/checkers/typecheck.py index fa3be9338..476897f28 100644 --- a/pylint/checkers/typecheck.py +++ b/pylint/checkers/typecheck.py @@ -65,11 +65,6 @@ from functools import singledispatch from typing import Pattern, Tuple import astroid -import astroid.arguments -import astroid.context -import astroid.nodes -from astroid import bases, decorators, exceptions, helpers, modutils, objects -from astroid.interpreter import dunder_lookup from pylint.checkers import BaseChecker, utils from pylint.checkers.utils import ( @@ -469,7 +464,7 @@ def _emit_no_member(node, owner, owner_name, ignored_mixins=True, ignored_none=T # invoked at this point. try: metaclass = owner.metaclass() - except exceptions.MroError: + except astroid.MroError: return False if metaclass: return metaclass.qname() == "enum.EnumMeta" @@ -481,14 +476,14 @@ def _emit_no_member(node, owner, owner_name, ignored_mixins=True, ignored_none=T # at some point during the runtime of the program. if utils.is_attribute_typed_annotation(owner, node.attrname): return False - if isinstance(owner, objects.Super): + if isinstance(owner, astroid.objects.Super): # Verify if we are dealing with an invalid Super object. # If it is invalid, then there's no point in checking that # it has the required attribute. Also, don't fail if the # MRO is invalid. try: owner.super_mro() - except (exceptions.MroError, exceptions.SuperError): + except (astroid.MroError, astroid.SuperError): return False if not all(map(has_known_bases, owner.type.mro())): return False @@ -544,7 +539,7 @@ def _determine_callable(callable_obj): try: # Use the last definition of __new__. new = callable_obj.local_attr("__new__")[-1] - except exceptions.NotFoundError: + except astroid.NotFoundError: new = None from_object = new and new.parent.scope().name == "object" @@ -554,7 +549,7 @@ def _determine_callable(callable_obj): try: # Use the last definition of __init__. callable_obj = callable_obj.local_attr("__init__")[-1] - except exceptions.NotFoundError as e: + except astroid.NotFoundError as e: # do nothing, covered by no-init. raise ValueError from e else: @@ -703,7 +698,7 @@ def _infer_from_metaclass_constructor(cls, func): def _is_c_extension(module_node): return ( - not modutils.is_standard_module(module_node.name) + not astroid.modutils.is_standard_module(module_node.name) and not module_node.fully_defined() ) @@ -865,11 +860,11 @@ accessed. Python regular expressions are accepted.", ), ) - @decorators.cachedproperty + @astroid.decorators.cachedproperty def _suggestion_mode(self): return get_global_option(self, "suggestion-mode", default=True) - @decorators.cachedproperty + @astroid.decorators.cachedproperty def _compiled_generated_members(self) -> Tuple[Pattern, ...]: # do this lazily since config not fully initialized in __init__ # generated_members may contain regular expressions @@ -945,7 +940,7 @@ accessed. Python regular expressions are accepted.", try: inferred = list(node.expr.infer()) - except exceptions.InferenceError: + except astroid.InferenceError: return # list of (node, nodename) which are missing the attribute @@ -988,7 +983,7 @@ accessed. Python regular expressions are accepted.", continue except AttributeError: continue - except exceptions.NotFoundError: + except astroid.NotFoundError: # This can't be moved before the actual .getattr call, # because there can be more values inferred and we are # stopping after the first one which has the attribute in question. @@ -1159,7 +1154,7 @@ accessed. Python regular expressions are accepted.", try: attrs = klass._proxied.getattr(node.func.attrname) - except exceptions.NotFoundError: + except astroid.NotFoundError: return for attr in attrs: @@ -1472,17 +1467,16 @@ accessed. Python regular expressions are accepted.", # type. This way we catch subclasses of sequence types but skip classes # that override __getitem__ and which may allow non-integer indices. try: - methods = dunder_lookup.lookup(parent_type, methodname) + methods = astroid.interpreter.dunder_lookup.lookup(parent_type, methodname) if methods is astroid.Uninferable: return None itemmethod = methods[0] except ( - exceptions.NotFoundError, - exceptions.AttributeInferenceError, + astroid.NotFoundError, + astroid.AttributeInferenceError, IndexError, ): return None - if ( not isinstance(itemmethod, astroid.FunctionDef) or itemmethod.root().name != BUILTINS @@ -1511,7 +1505,7 @@ accessed. Python regular expressions are accepted.", try: index_type.getattr("__index__") return None - except exceptions.NotFoundError: + except astroid.NotFoundError: pass elif isinstance(index_type, astroid.Slice): # A slice can be present @@ -1555,7 +1549,7 @@ accessed. Python regular expressions are accepted.", try: index_type.getattr("__index__") return - except exceptions.NotFoundError: + except astroid.NotFoundError: pass invalid_slices += 1 @@ -1593,7 +1587,7 @@ accessed. Python regular expressions are accepted.", if inferred is None or inferred is astroid.Uninferable: continue - if isinstance(inferred, bases.Generator): + if isinstance(inferred, astroid.bases.Generator): # Check if we are dealing with a function decorated # with contextlib.contextmanager. if decorated_with( @@ -1632,7 +1626,7 @@ accessed. Python regular expressions are accepted.", try: inferred.getattr("__enter__") inferred.getattr("__exit__") - except exceptions.NotFoundError: + except astroid.NotFoundError: if isinstance(inferred, astroid.Instance): # If we do not know the bases of this class, # just skip it. @@ -1705,7 +1699,7 @@ accessed. Python regular expressions are accepted.", """Check if left or right node is of type `type`.""" msg = msg = "unsupported operand type(s) for |" for n in (node.left, node.right): - n = helpers.object_type(n) + n = astroid.helpers.object_type(n) if isinstance(n, astroid.ClassDef) and is_classdef_type(n): self.add_message("unsupported-binary-operation", args=msg, node=node) break @@ -1806,7 +1800,7 @@ accessed. Python regular expressions are accepted.", return if getattr(inferred, "decorators", None): - first_decorator = helpers.safe_infer(inferred.decorators.nodes[0]) + first_decorator = astroid.helpers.safe_infer(inferred.decorators.nodes[0]) if isinstance(first_decorator, astroid.ClassDef): inferred = first_decorator.instantiate_class() else: diff --git a/pylint/checkers/utils.py b/pylint/checkers/utils.py index ef9ff68d2..7d9548154 100644 --- a/pylint/checkers/utils.py +++ b/pylint/checkers/utils.py @@ -69,9 +69,6 @@ from typing import ( import _string import astroid -from astroid import bases as _bases -from astroid import helpers, scoped_nodes -from astroid.exceptions import _NonDeducibleTypeHierarchy from pylint.constants import PY310_PLUS @@ -460,7 +457,11 @@ def is_func_decorator(node: astroid.node_classes.NodeNG) -> bool: return True if parent.is_statement or isinstance( parent, - (astroid.Lambda, scoped_nodes.ComprehensionScope, scoped_nodes.ListComp), + ( + astroid.Lambda, + astroid.scoped_nodes.ComprehensionScope, + astroid.scoped_nodes.ListComp, + ), ): break parent = parent.parent @@ -1137,7 +1138,7 @@ def _supports_protocol( return True if ( - isinstance(value, _bases.Proxy) + isinstance(value, astroid.bases.Proxy) and isinstance(value._proxied, astroid.BaseInstance) and has_known_bases(value._proxied) ): @@ -1370,9 +1371,9 @@ def is_subclass_of(child: astroid.ClassDef, parent: astroid.ClassDef) -> bool: for ancestor in child.ancestors(): try: - if helpers.is_subtype(ancestor, parent): + if astroid.helpers.is_subtype(ancestor, parent): return True - except _NonDeducibleTypeHierarchy: + except astroid.exceptions._NonDeducibleTypeHierarchy: continue return False diff --git a/pylint/checkers/variables.py b/pylint/checkers/variables.py index f9c1f0fe4..875257155 100644 --- a/pylint/checkers/variables.py +++ b/pylint/checkers/variables.py @@ -54,8 +54,6 @@ import re from functools import lru_cache import astroid -from astroid import decorators, modutils, objects -from astroid.context import InferenceContext from pylint.checkers import BaseChecker, utils from pylint.checkers.utils import is_postponed_evaluation_enabled @@ -253,7 +251,7 @@ def _detect_global_scope(node, frame, defframe): def _infer_name_module(node, name): - context = InferenceContext() + context = astroid.context.InferenceContext() context.lookupname = name return node.infer(context, asname=False) @@ -1243,15 +1241,15 @@ class VariablesChecker(BaseChecker): self._store_type_annotation_node(annotation) # Relying on other checker's options, which might not have been initialized yet. - @decorators.cachedproperty + @astroid.decorators.cachedproperty def _analyse_fallback_blocks(self): return get_global_option(self, "analyse-fallback-blocks", default=False) - @decorators.cachedproperty + @astroid.decorators.cachedproperty def _ignored_modules(self): return get_global_option(self, "ignored-modules", default=[]) - @decorators.cachedproperty + @astroid.decorators.cachedproperty def _allow_global_unused_variables(self): return get_global_option(self, "allow-global-unused-variables", default=True) @@ -1608,7 +1606,7 @@ class VariablesChecker(BaseChecker): astroid.Tuple, astroid.Dict, astroid.Set, - objects.FrozenSet, + astroid.objects.FrozenSet, ) if not isinstance(inferred, sequences): self.add_message("undefined-loop-variable", args=name, node=node) @@ -1978,7 +1976,7 @@ class VariablesChecker(BaseChecker): if os.path.basename(basename) == "__init__": name = node.name + "." + elt_name try: - modutils.file_from_modpath(name.split(".")) + astroid.modutils.file_from_modpath(name.split(".")) except ImportError: self.add_message( "undefined-all-variable", args=(elt_name,), node=elt diff --git a/pylint/constants.py b/pylint/constants.py index 7181cb355..2124a2020 100644 --- a/pylint/constants.py +++ b/pylint/constants.py @@ -3,7 +3,7 @@ import sys -from astroid.__pkginfo__ import version as astroid_version +import astroid from pylint.__pkginfo__ import version as pylint_version @@ -46,5 +46,5 @@ class WarningScope: full_version = f"""pylint {pylint_version} -astroid {astroid_version} -Python { sys.version}""" +astroid {astroid.__version__} +Python {sys.version}""" diff --git a/pylint/lint/pylinter.py b/pylint/lint/pylinter.py index 1f7b528a5..5a662a079 100644 --- a/pylint/lint/pylinter.py +++ b/pylint/lint/pylinter.py @@ -13,8 +13,6 @@ import warnings from io import TextIOWrapper import astroid -from astroid import modutils -from astroid.builder import AstroidBuilder from pylint import checkers, config, exceptions, interfaces, reporters from pylint.constants import MAIN_CHECKER_NAME, MSG_TYPES @@ -502,7 +500,7 @@ class PyLinter( if modname in self._dynamic_plugins: continue self._dynamic_plugins.add(modname) - module = modutils.load_module_from_name(modname) + module = astroid.modutils.load_module_from_name(modname) module.register(self) def load_plugin_configuration(self): @@ -513,7 +511,7 @@ class PyLinter( settings. """ for modname in self._dynamic_plugins: - module = modutils.load_module_from_name(modname) + module = astroid.modutils.load_module_from_name(modname) if hasattr(module, "load_configuration"): module.load_configuration(self) @@ -531,7 +529,8 @@ class PyLinter( def _load_reporter_class(self): qname = self._reporter_name - module = modutils.load_module_from_name(modutils.get_module_part(qname)) + module_part = astroid.modutils.get_module_part(qname) + module = astroid.modutils.load_module_from_name(module_part) class_name = qname.split(".")[-1] reporter_class = getattr(module, class_name) return reporter_class @@ -953,7 +952,7 @@ class PyLinter( # Note that this function does not really perform an # __import__ but may raise an ImportError exception, which # we want to catch here. - modname = ".".join(modutils.modpath_from_file(filepath)) + modname = ".".join(astroid.modutils.modpath_from_file(filepath)) except ImportError: modname = os.path.splitext(os.path.basename(filepath))[0] @@ -1043,7 +1042,9 @@ class PyLinter( try: if data is None: return MANAGER.ast_from_file(filepath, modname, source=True) - return AstroidBuilder(MANAGER).string_build(data, modname, filepath) + return astroid.builder.AstroidBuilder(MANAGER).string_build( + data, modname, filepath + ) except astroid.AstroidSyntaxError as ex: # pylint: disable=no-member self.add_message( diff --git a/pylint/utils/utils.py b/pylint/utils/utils.py index 0b4351722..b06cf3026 100644 --- a/pylint/utils/utils.py +++ b/pylint/utils/utils.py @@ -1,6 +1,7 @@ # Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html # For details: https://github.com/PyCQA/pylint/blob/master/COPYING + try: import isort.api diff --git a/tests/unittest_pyreverse_inspector.py b/tests/unittest_pyreverse_inspector.py index 7871fdb33..add2910d2 100644 --- a/tests/unittest_pyreverse_inspector.py +++ b/tests/unittest_pyreverse_inspector.py @@ -17,7 +17,6 @@ import os import astroid import pytest -from astroid import bases, nodes from unittest_pyreverse_writer import get_project from pylint.pyreverse import inspector @@ -35,7 +34,7 @@ def test_class_implements(project): klass = project.get_module("data.clientmodule_test")["Ancestor"] assert hasattr(klass, "implements") assert len(klass.implements) == 1 - assert isinstance(klass.implements[0], nodes.ClassDef) + assert isinstance(klass.implements[0], astroid.nodes.ClassDef) assert klass.implements[0].name == "Interface" @@ -65,7 +64,9 @@ def test_instance_attrs_resolution(project): assert len(type_dict) == 2 keys = sorted(type_dict.keys()) assert keys == ["_id", "relation"] - assert isinstance(type_dict["relation"][0], bases.Instance), type_dict["relation"] + assert isinstance(type_dict["relation"][0], astroid.bases.Instance), type_dict[ + "relation" + ] assert type_dict["relation"][0].name == "DoNothing" assert type_dict["_id"][0] is astroid.Uninferable |