From 60dc4441f52dcf9d3ffd78b37be304bdce84b87e Mon Sep 17 00:00:00 2001 From: Claudiu Popa Date: Tue, 1 Dec 2015 14:58:59 +0200 Subject: Don't emit import-self and cyclic-import for relative imports of modules with the same name as the package itself. The problem was partially the fault of astroid.modutils.get_module_part, in combination with a given context file. The function returned 'dummy' as the module part for the string `dummy.dummy.Dummy`, which is in fact true, since the first dummy is the package and the second dummy is the module from where Dummy gets loaded. But get_module_part has no way to know this semantic inference, that the second dummy is a relative import inside the first one. As such, it's better to just skip the check if the condition of being relative inside a __init__.py file is found, since there's no way to load itself in that case. Closes issues #708 and #706. --- pylint/checkers/imports.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'pylint/checkers/imports.py') diff --git a/pylint/checkers/imports.py b/pylint/checkers/imports.py index a2f381c..0e16d18 100644 --- a/pylint/checkers/imports.py +++ b/pylint/checkers/imports.py @@ -496,14 +496,26 @@ given file (report RP0402 must not be disabled)'} def _add_imported_module(self, node, importedmodname): """notify an imported module, used to analyze dependencies""" + module_file = node.root().file + context_name = node.root().name + base = os.path.splitext(os.path.basename(module_file))[0] + + # Determine if we have a `from .something import` in a package's + # __init__. This means the module will never be able to import + # itself using this condition (the level will be bigger or + # if the same module is named as the package, it will be different + # anyway). + if isinstance(node, astroid.ImportFrom): + if node.level and node.level > 0 and base == '__init__': + return + try: importedmodname = get_module_part(importedmodname, - node.root().file) + module_file) except ImportError: pass - context_name = node.root().name + if context_name == importedmodname: - # module importing itself ! self.add_message('import-self', node=node) elif not is_standard_module(importedmodname): # handle dependencies -- cgit v1.2.1