]> granicus.if.org Git - python/commitdiff
Issue #25111: Fixed comparison of traceback.FrameSummary.
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 29 Sep 2015 19:33:36 +0000 (22:33 +0300)
committerSerhiy Storchaka <storchaka@gmail.com>
Tue, 29 Sep 2015 19:33:36 +0000 (22:33 +0300)
Lib/test/test_traceback.py
Lib/traceback.py
Misc/NEWS

index 036250491074ab5c6d968ddc526586958cac3593..b7695d6eb4ba8816f2b7232b8bf53ab512210e49 100644 (file)
@@ -640,7 +640,7 @@ class MiscTracebackCases(unittest.TestCase):
             return traceback.extract_stack()
         result = extract()
         lineno = extract.__code__.co_firstlineno
-        self.assertEqual([tuple(x) for x in result[-2:]], [
+        self.assertEqual(result[-2:], [
             (__file__, lineno+2, 'test_extract_stack', 'result = extract()'),
             (__file__, lineno+1, 'extract', 'return traceback.extract_stack()'),
             ])
@@ -652,10 +652,16 @@ class TestFrame(unittest.TestCase):
         linecache.clearcache()
         linecache.lazycache("f", globals())
         f = traceback.FrameSummary("f", 1, "dummy")
-        self.assertEqual(
-            ("f", 1, "dummy", '"""Test cases for traceback module"""'),
-            tuple(f))
-        self.assertEqual(None, f.locals)
+        self.assertEqual(f,
+            ("f", 1, "dummy", '"""Test cases for traceback module"""'))
+        self.assertEqual(tuple(f),
+            ("f", 1, "dummy", '"""Test cases for traceback module"""'))
+        self.assertEqual(f, traceback.FrameSummary("f", 1, "dummy"))
+        self.assertEqual(f, tuple(f))
+        # Since tuple.__eq__ doesn't support FrameSummary, the equality
+        # operator fallbacks to FrameSummary.__eq__.
+        self.assertEqual(tuple(f), f)
+        self.assertIsNone(f.locals)
 
     def test_lazy_lines(self):
         linecache.clearcache()
index 112e9ba82959d750251e591e1159168e51da44e2..9b69da0e8ae3c735bf72feb1d7aab80da7425b51 100644 (file)
@@ -257,10 +257,14 @@ class FrameSummary:
             dict((k, repr(v)) for k, v in locals.items()) if locals else None
 
     def __eq__(self, other):
-        return (self.filename == other.filename and
-                self.lineno == other.lineno and
-                self.name == other.name and
-                self.locals == other.locals)
+        if isinstance(other, FrameSummary):
+            return (self.filename == other.filename and
+                    self.lineno == other.lineno and
+                    self.name == other.name and
+                    self.locals == other.locals)
+        if isinstance(other, tuple):
+            return (self.filename, self.lineno, self.name, self.line) == other
+        return NotImplemented
 
     def __getitem__(self, pos):
         return (self.filename, self.lineno, self.name, self.line)[pos]
index b5307cfeab30be5808eeee9ffc0618a422a5aa05..08b20b9ff182c34bf069d4d6f29f1b6d71e6a9de 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -21,6 +21,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #25111: Fixed comparison of traceback.FrameSummary.
+
 - Issue #25262. Added support for BINBYTES8 opcode in Python implementation of
   unpickler.  Highest 32 bits of 64-bit size for BINUNICODE8 and BINBYTES8
   opcodes no longer silently ignored on 32-bit platforms in C implementation.