Skip to content

Commit 45fc732

Browse files
committed
checker.py: Check for invalid print syntax
New warning added in messages.py to check for invalid print syntax Closes #242
1 parent e26f3b9 commit 45fc732

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

pyflakes/checker.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,13 @@ def handleNodeLoad(self, node):
768768
# iteration
769769
continue
770770

771+
if (name == 'print' and
772+
isinstance(scope.get(name, None), Builtin)):
773+
parent = self.getParent(node)
774+
if (isinstance(parent, ast.BinOp) and
775+
isinstance(parent.op, ast.RShift)):
776+
self.report(messages.InvalidPrintSyntax, node)
777+
771778
try:
772779
scope[name].used = (self.scope, node)
773780
except KeyError:

pyflakes/messages.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,3 +250,7 @@ def __init__(self, filename, loc, annotation):
250250

251251
class RaiseNotImplemented(Message):
252252
message = "'raise NotImplemented' should be 'raise NotImplementedError'"
253+
254+
255+
class InvalidPrintSyntax(Message):
256+
message = 'use of >> is invalid with print function'

pyflakes/test/test_other.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2034,3 +2034,53 @@ def test_raise_notimplemented(self):
20342034
self.flakes('''
20352035
raise NotImplemented
20362036
''', m.RaiseNotImplemented)
2037+
2038+
2039+
class TestIncompatiblePrintOperator(TestCase):
2040+
"""
2041+
Tests for warning about invalid use of print function.
2042+
"""
2043+
2044+
def test_valid_print(self):
2045+
self.flakes('''
2046+
print("Hello")
2047+
''')
2048+
2049+
def test_invalid_print_when_imported_from_future(self):
2050+
exc = self.flakes('''
2051+
from __future__ import print_function
2052+
import sys
2053+
print >>sys.stderr, "Hello"
2054+
''', m.InvalidPrintSyntax).messages[0]
2055+
2056+
self.assertEqual(exc.lineno, 4)
2057+
self.assertEqual(exc.col, 0)
2058+
2059+
def test_print_function_assignment(self):
2060+
"""
2061+
A valid assignment, tested for catching false positives.
2062+
"""
2063+
self.flakes('''
2064+
from __future__ import print_function
2065+
log = print
2066+
log("Hello")
2067+
''')
2068+
2069+
def test_print_in_lambda(self):
2070+
self.flakes('''
2071+
from __future__ import print_function
2072+
a = lambda: print
2073+
''')
2074+
2075+
def test_print_returned_in_function(self):
2076+
self.flakes('''
2077+
from __future__ import print_function
2078+
def a():
2079+
return print
2080+
''')
2081+
2082+
def test_print_as_condition_test(self):
2083+
self.flakes('''
2084+
from __future__ import print_function
2085+
if print: pass
2086+
''')

0 commit comments

Comments
 (0)