summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Vandenberg <jayvdb@gmail.com>2015-11-19 02:44:31 +1100
committerJohn Vandenberg <jayvdb@gmail.com>2015-11-19 02:51:53 +1100
commit02f55ed784db600d02ae130ec325ac37d44322a9 (patch)
tree9316ebd74ae84d21a0263f2b046c01488ebf64ef
parentf048360b775a9cfffb1c42a2e5cf6f25ffe895f9 (diff)
downloadpyflakes-02f55ed784db600d02ae130ec325ac37d44322a9.tar.gz
Python 3 only allows import * at module level
-rw-r--r--pyflakes/checker.py5
-rw-r--r--pyflakes/messages.py8
-rw-r--r--pyflakes/test/test_imports.py20
-rw-r--r--pyflakes/test/test_undefined_names.py1
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