]> granicus.if.org Git - python/commitdiff
Unparse infinite imaginary literals correctly. Add some more numeric tests.
authorMark Dickinson <dickinsm@gmail.com>
Wed, 30 Jun 2010 11:45:53 +0000 (11:45 +0000)
committerMark Dickinson <dickinsm@gmail.com>
Wed, 30 Jun 2010 11:45:53 +0000 (11:45 +0000)
Demo/parser/test_unparse.py
Demo/parser/unparse.py

index 3a795e9974428e1e6b60cc105e0c286210e01c90..d457523b7c2d13f9970c975aba30e42ece8409e2 100644 (file)
@@ -123,6 +123,8 @@ class UnparseTestCase(ASTTestCase):
 
     def test_unary_parens(self):
         self.check_roundtrip("(-1)**7")
+        self.check_roundtrip("(-1.)**8")
+        self.check_roundtrip("(-1j)**6")
         self.check_roundtrip("not True or False")
         self.check_roundtrip("True or not False")
 
@@ -132,6 +134,18 @@ class UnparseTestCase(ASTTestCase):
     def test_huge_float(self):
         self.check_roundtrip("1e1000")
         self.check_roundtrip("-1e1000")
+        self.check_roundtrip("1e1000j")
+        self.check_roundtrip("-1e1000j")
+
+    def test_min_int(self):
+        self.check_roundtrip(str(-2**31))
+        self.check_roundtrip(str(-2**63))
+
+    def test_imaginary_literals(self):
+        self.check_roundtrip("7j")
+        self.check_roundtrip("-7j")
+        self.check_roundtrip("0j")
+        self.check_roundtrip("-0j")
 
     def test_lambda_parentheses(self):
         self.check_roundtrip("(lambda: int)()")
index e1c27192c246ea8047c807ed7394e01af02282aa..e96ef5477b872ae9e11b83ef95e4da71761ed5d7 100644 (file)
@@ -6,6 +6,10 @@ import tokenize
 import io
 import os
 
+# Large float and imaginary literals get turned into infinities in the AST.
+# We unparse those infinities to INFSTR.
+INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1)
+
 def interleave(inter, f, seq):
     """Call f on each item in seq, calling inter() in between.
     """
@@ -311,11 +315,8 @@ class Unparser:
         self.write(t.id)
 
     def _Num(self, t):
-        if isinstance(t.n, float) and math.isinf(t.n):
-            # Subsitute overflowing decimal literal for AST infinity
-            self.write("1e" + repr(sys.float_info.max_10_exp + 1))
-        else:
-            self.write(repr(t.n))
+        # Substitute overflowing decimal literal for AST infinities.
+        self.write(repr(t.n).replace("inf", INFSTR))
 
     def _List(self, t):
         self.write("[")