[Python-checkins] r52880 - sandbox/trunk/2to3/example.py sandbox/trunk/2to3/fix_print.py sandbox/trunk/2to3/pytree.py

guido.van.rossum python-checkins at python.org
Fri Dec 1 00:15:21 CET 2006


Author: guido.van.rossum
Date: Fri Dec  1 00:15:20 2006
New Revision: 52880

Added:
   sandbox/trunk/2to3/fix_print.py   (contents, props changed)
Modified:
   sandbox/trunk/2to3/example.py
   sandbox/trunk/2to3/pytree.py
Log:
Completed the print stmt -> function refactoring.


Modified: sandbox/trunk/2to3/example.py
==============================================================================
--- sandbox/trunk/2to3/example.py	(original)
+++ sandbox/trunk/2to3/example.py	Fri Dec  1 00:15:20 2006
@@ -1,6 +1,7 @@
 #!/usr/bin/python
 	# comment indented by tab
 """Docstring."""
+import sys
 
 d = {"x": 42}
 if d.has_key("x") or d.has_key("y"):
@@ -10,4 +11,32 @@
 def foo():
 	pass # body indented by tab
 
+def print_examples():
+    # plain vanilla
+    print 1, 1+1, 1+1+1
+    #
+    print 1, 2
+    #
+    print 1
+
+    print
+
+    # trailing commas
+    print 1, 2, 3,
+    #
+    print 1, 2,
+    #
+    print 1,
+    #
+    print
+
+    # >> stuff
+    print >>sys.stderr, 1, 2, 3    # no trailing comma
+    #
+    print >>sys.stdder, 1, 2,      # trailing comma
+    #
+    print >>sys.stderr, 1+1        # no trailing comma
+    #
+    print >>  sys.stderr           # spaces before sys.stderr
+
 # This is the last line.

Added: sandbox/trunk/2to3/fix_print.py
==============================================================================
--- (empty file)
+++ sandbox/trunk/2to3/fix_print.py	Fri Dec  1 00:15:20 2006
@@ -0,0 +1,126 @@
+#!/usr/bin/env python2.5
+# Copyright 2006 Google Inc. All Rights Reserved.
+# Licensed to PSF under a Contributor Agreement.
+
+"""Refactoring tool: change 'x.has_key(y)' into 'y in x'."""
+
+__author__ = "Guido van Rossum <guido at python.org>"
+
+# Python imports
+import os
+import sys
+import token
+import logging
+
+import pgen2
+from pgen2 import driver
+
+import pytree
+
+logging.basicConfig(level=logging.DEBUG)
+
+gr = driver.load_grammar("Grammar.txt") # used by node initializers
+
+
+class Symbols(object):
+
+    def __init__(self, gr):
+        for name, symbol in gr.symbol2number.iteritems():
+            setattr(self, name, symbol)
+
+
+syms = Symbols(gr)
+
+
+def main():
+    args = sys.argv[1:] or ["example.py"]
+
+    dr = driver.Driver(gr, convert=pytree.convert)
+
+    for fn in args:
+        print "Parsing", fn
+        tree = dr.parse_file(fn)
+        refactor(tree)
+        diff(fn, tree)
+
+
+def refactor(tree):
+    visit(tree, fix_print)
+
+
+def visit(node, func):
+    func(node)
+    for child in node.children:
+        visit(child, func)
+
+
+def fix_print(node):
+    if node.type != syms.print_stmt:
+        return
+    print "Bingo! >>>%s<<<" % node
+    assert node.children[0] == pytree.Leaf(token.NAME, "print")
+    args = node.children[1:]
+    sep = end = file = None
+    if args and args[-1] == pytree.Leaf(token.COMMA, ","):
+        args = args[:-1]
+        sep = " "
+        end = ""
+    if args and args[0] == pytree.Leaf(token.RIGHTSHIFT, ">>"):
+        assert len(args) >= 2
+        file = args[1]
+        args = args[3:] # Strip a possible comma after the file expression
+    # Now synthesize a Print(args, sep=..., end=..., file=...) node.
+    n_print = pytree.Leaf(token.NAME, "Print") # XXX -> "print"
+    l_args = list(args)
+    if l_args:
+        l_args[0].set_prefix("")
+    if sep is not None or end is not None or file is not None:
+        if sep is not None:
+            add_kwarg(l_args, "sep",
+                      pytree.Leaf(token.STRING, repr(sep)))
+        if end is not None:
+            add_kwarg(l_args, "end",
+                      pytree.Leaf(token.STRING, repr(end)))
+        if file is not None:
+            add_kwarg(l_args, "file", file)
+    if l_args:
+        n_arglist = pytree.Node(syms.arglist, l_args)
+    else:
+        n_arglist = None
+    l_args = [pytree.Leaf(token.LPAR, "("), pytree.Leaf(token.RPAR, ")")]
+    if n_arglist:
+        l_args.insert(1, n_arglist)
+    n_trailer = pytree.Node(syms.trailer, l_args)
+    n_stmt = pytree.Node(syms.power, (n_print, n_trailer))
+    n_stmt.set_prefix(node.get_prefix())
+    print "Synthesized: >>>%s<<<" % n_stmt
+    node.parent.replace(node, n_stmt)
+
+
+def add_kwarg(l_nodes, s_kwd, n_expr):
+    # XXX All this prefix-setting may lose comments (though rarely)
+    n_expr.set_prefix("")
+    n_argument = pytree.Node(syms.argument,
+                             (pytree.Leaf(token.NAME, s_kwd),
+                              pytree.Leaf(token.EQUAL, "="),
+                              n_expr))
+    if l_nodes:
+        l_nodes.append(pytree.Leaf(token.COMMA, ","))
+        n_argument.set_prefix(" ")
+    l_nodes.append(n_argument)
+
+
+def diff(fn, tree):
+    f = open("@", "w")
+    try:
+        f.write(str(tree))
+    finally:
+        f.close()
+    try:
+        return os.system("diff -u %s @" % fn)
+    finally:
+        os.remove("@")
+
+
+if __name__ == "__main__":
+    main()

Modified: sandbox/trunk/2to3/pytree.py
==============================================================================
--- sandbox/trunk/2to3/pytree.py	(original)
+++ sandbox/trunk/2to3/pytree.py	Fri Dec  1 00:15:20 2006
@@ -87,6 +87,8 @@
 
 class Leaf(Base):
 
+    lineno = column = 0
+
     def __init__(self, type, value, context=None):
         if context is not None:
             self.prefix, (self.lineno, self.column) = context


More information about the Python-checkins mailing list