diff --git a/ChangeLog b/ChangeLog index e3cf473830..6134fca00f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -83,6 +83,10 @@ Release date: TBA Closes #1375 Closes #330 +* Fix false positives for invalid-all-format that are lists or tuples at runtime + + Closes #4711 + * Fix ``no-self-use`` and ``docparams extension`` for async functions and methods. * Add documentation for ``pyreverse`` and ``symilar`` diff --git a/pylint/checkers/variables.py b/pylint/checkers/variables.py index 411e016f5e..307a05feb1 100644 --- a/pylint/checkers/variables.py +++ b/pylint/checkers/variables.py @@ -2013,15 +2013,14 @@ def _check_module_attrs(self, node, module, module_names): return module return None - def _check_all(self, node, not_consumed): + def _check_all(self, node: nodes.Module, not_consumed): assigned = next(node.igetattr("__all__")) if assigned is astroid.Uninferable: return - - if not isinstance(assigned, (nodes.Tuple, nodes.List, list, tuple)): - self.add_message("invalid-all-format", node=assigned) + if not assigned.pytype() in ["builtins.list", "builtins.tuple"]: + line, col = assigned.tolineno, assigned.col_offset + self.add_message("invalid-all-format", line=line, col_offset=col, node=node) return - for elt in getattr(assigned, "elts", ()): try: elt_name = next(elt.infer()) diff --git a/tests/functional/i/invalid/invalid_all_format.txt b/tests/functional/i/invalid/invalid_all_format.txt index 75c6fe0a78..f10297d4ee 100644 --- a/tests/functional/i/invalid/invalid_all_format.txt +++ b/tests/functional/i/invalid/invalid_all_format.txt @@ -1 +1 @@ -invalid-all-format:5:11::Invalid format for __all__, must be tuple or list +invalid-all-format:5:11::Invalid format for __all__, must be tuple or list:HIGH diff --git a/tests/functional/i/invalid/invalid_all_format_valid_5.py b/tests/functional/i/invalid/invalid_all_format_valid_5.py new file mode 100644 index 0000000000..aa0e4dbf39 --- /dev/null +++ b/tests/functional/i/invalid/invalid_all_format_valid_5.py @@ -0,0 +1,7 @@ +"""Test valid __all__ format.""" + +# pylint: disable=import-error, unused-import + +from foo import bar + +__all__ = list(globals().keys()) diff --git a/tests/functional/i/invalid/invalid_all_format_valid_6.py b/tests/functional/i/invalid/invalid_all_format_valid_6.py new file mode 100644 index 0000000000..64ac46bb7e --- /dev/null +++ b/tests/functional/i/invalid/invalid_all_format_valid_6.py @@ -0,0 +1,7 @@ +"""Test valid __all__ format.""" + +# pylint: disable=import-error, unused-import + +from foo import bar + +__all__ = tuple(globals().keys())