diff options
author | John Vandenberg <jayvdb@gmail.com> | 2015-11-19 02:44:31 +1100 |
---|---|---|
committer | John Vandenberg <jayvdb@gmail.com> | 2015-11-19 02:51:53 +1100 |
commit | 02f55ed784db600d02ae130ec325ac37d44322a9 (patch) | |
tree | 9316ebd74ae84d21a0263f2b046c01488ebf64ef | |
parent | f048360b775a9cfffb1c42a2e5cf6f25ffe895f9 (diff) | |
download | pyflakes-02f55ed784db600d02ae130ec325ac37d44322a9.tar.gz |
Python 3 only allows import * at module level
-rw-r--r-- | pyflakes/checker.py | 5 | ||||
-rw-r--r-- | pyflakes/messages.py | 8 | ||||
-rw-r--r-- | pyflakes/test/test_imports.py | 20 | ||||
-rw-r--r-- | pyflakes/test/test_undefined_names.py | 1 |
4 files changed, 34 insertions, 0 deletions
diff --git a/pyflakes/checker.py b/pyflakes/checker.py index 825e0bd..753fa9b 100644 --- a/pyflakes/checker.py +++ b/pyflakes/checker.py @@ -960,6 +960,11 @@ class Checker(object): for alias in node.names: if alias.name == '*': + # Only Python 2, local import * is a SyntaxWarning + if not PY2 and not isinstance(self.scope, ModuleScope): + self.report(messages.ImportStarNotPermitted, + node, node.module) + continue self.scope.importStarred = True self.report(messages.ImportStarUsed, node, node.module) continue diff --git a/pyflakes/messages.py b/pyflakes/messages.py index 27167e0..40142a4 100644 --- a/pyflakes/messages.py +++ b/pyflakes/messages.py @@ -49,6 +49,14 @@ class ImportShadowedByLoopVar(Message): self.message_args = (name, orig_loc.lineno) +class ImportStarNotPermitted(Message): + message = "'from %s import *' only allowed at module level" + + def __init__(self, filename, loc, modname): + Message.__init__(self, filename, loc) + self.message_args = (modname,) + + class ImportStarUsed(Message): message = "'from %s import *' used; unable to detect undefined names" diff --git a/pyflakes/test/test_imports.py b/pyflakes/test/test_imports.py index 158f315..54351e9 100644 --- a/pyflakes/test/test_imports.py +++ b/pyflakes/test/test_imports.py @@ -606,7 +606,27 @@ class Test(TestCase): ''') def test_importStar(self): + """Use of import * at module level is reported.""" self.flakes('from fu import *', m.ImportStarUsed) + self.flakes(''' + try: + from fu import * + except: + pass + ''', m.ImportStarUsed) + + @skipIf(version_info < (3,), + 'import * below module level is a warning on Python 2') + def test_localImportStar(self): + """import * is only allowed at module level.""" + self.flakes(''' + def a(): + from fu import * + ''', m.ImportStarNotPermitted) + self.flakes(''' + class a: + from fu import * + ''', m.ImportStarNotPermitted) def test_packageImport(self): """ diff --git a/pyflakes/test/test_undefined_names.py b/pyflakes/test/test_undefined_names.py index 1a3c3a5..54af0eb 100644 --- a/pyflakes/test/test_undefined_names.py +++ b/pyflakes/test/test_undefined_names.py @@ -73,6 +73,7 @@ class Test(TestCase): """Can't find undefined names with import *.""" self.flakes('from fu import *; bar', m.ImportStarUsed) + @skipIf(version_info >= (3,), 'obsolete syntax') def test_localImportStar(self): """ A local import * still allows undefined names to be found |