]> granicus.if.org Git - python/commitdiff
Add parentheses around numeric literals, to avoid turning 3 .bit_length() into 3...
authorMark Dickinson <dickinsm@gmail.com>
Tue, 29 Jun 2010 08:52:36 +0000 (08:52 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Tue, 29 Jun 2010 08:52:36 +0000 (08:52 +0000)
Demo/parser/test_unparse.py
Demo/parser/unparse.py

index 5832b8ffb7444d31b336da8b4f155f2af9c636ca..0d138973b3a702e0764ca9dffb27ee985623d7c8 100644 (file)
@@ -84,6 +84,9 @@ class UnparseTestCase(unittest.TestCase):
         self.check_roundtrip("not True or False")
         self.check_roundtrip("True or not False")
 
+    def test_integer_parens(self):
+        self.check_roundtrip("3 .__abs__()")
+
     def test_chained_comparisons(self):
         self.check_roundtrip("1 < 4 <= 5")
         self.check_roundtrip("a is b is c is not d")
index 56728734c76befa95b1c7357c5bbb6b401898d64..2c383a5eaced94daeb62b50bfecf67ed8806e69e 100644 (file)
@@ -302,16 +302,17 @@ class Unparser:
         self.write("`")
 
     def _Num(self, t):
-        # There are no negative numeric literals in Python; however,
-        # some optimizations produce a negative Num in the AST. Add
-        # parentheses to avoid turning (-1)**2 into -1**2.
-        strnum = repr(t.n)
-        if strnum.startswith("-"):
-            self.write("(")
-            self.write(strnum)
-            self.write(")")
-        else:
-            self.write(strnum)
+        # Add parentheses around numeric literals to avoid:
+        #
+        #  (1) turning (-1)**2 into -1**2, and
+        #  (2) turning 3 .__abs__() into 3.__abs__()
+        #
+        # For (1), note that Python doesn't actually have negative
+        # numeric literals, but (at least in Python 2.x) there's a CST
+        # transformation that can produce negative Nums in the AST.
+        self.write("(")
+        self.write(repr(t.n))
+        self.write(")")
 
     def _List(self, t):
         self.write("[")