]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.13] gh-132385: Fix instance error suggestions trigger potential exceptions in...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 2 May 2025 13:27:54 +0000 (15:27 +0200)
committerGitHub <noreply@github.com>
Fri, 2 May 2025 13:27:54 +0000 (13:27 +0000)
gh-132385: Fix instance error suggestions trigger potential exceptions in `traceback` (GH-132387)
(cherry picked from commit 641253cfac789e57c2b0c16047bdbf355535f60f)

Co-authored-by: sobolevn <mail@sobolevn.me>
Lib/test/test_traceback.py
Lib/traceback.py
Misc/NEWS.d/next/Library/2025-04-11-12-41-47.gh-issue-132385.86HoA7.rst [new file with mode: 0644]

index e906fcc17c6c5d89300d88506dc21d12402a6b52..eaa1a4fa4fc74fcadb17277009d5598d6ecb72bd 100644 (file)
@@ -4549,6 +4549,28 @@ class SuggestionFormattingTestBase:
         actual = self.get_suggestion(instance.foo)
         self.assertNotIn("self.blech", actual)
 
+    def test_unbound_local_error_with_side_effect(self):
+        # gh-132385
+        class A:
+            def __getattr__(self, key):
+                if key == 'foo':
+                    raise AttributeError('foo')
+                if key == 'spam':
+                    raise ValueError('spam')
+
+            def bar(self):
+                foo
+            def baz(self):
+                spam
+
+        suggestion = self.get_suggestion(A().bar)
+        self.assertNotIn('self.', suggestion)
+        self.assertIn("'foo'", suggestion)
+
+        suggestion = self.get_suggestion(A().baz)
+        self.assertNotIn('self.', suggestion)
+        self.assertIn("'spam'", suggestion)
+
     def test_unbound_local_error_does_not_match(self):
         def func():
             something = 3
index 12235a8d93ea5c175acd1e77dc575e47b8c87b94..a3b7de085701c6da1ae9d51543ed8f36f5e380f6 100644 (file)
@@ -1528,7 +1528,11 @@ def _compute_suggestion_error(exc_value, tb, wrong_name):
         # has the wrong name as attribute
         if 'self' in frame.f_locals:
             self = frame.f_locals['self']
-            if hasattr(self, wrong_name):
+            try:
+                has_wrong_name = hasattr(self, wrong_name)
+            except Exception:
+                has_wrong_name = False
+            if has_wrong_name:
                 return f"self.{wrong_name}"
 
     try:
diff --git a/Misc/NEWS.d/next/Library/2025-04-11-12-41-47.gh-issue-132385.86HoA7.rst b/Misc/NEWS.d/next/Library/2025-04-11-12-41-47.gh-issue-132385.86HoA7.rst
new file mode 100644 (file)
index 0000000..9aa2da4
--- /dev/null
@@ -0,0 +1,2 @@
+Fix instance error suggestions trigger potential exceptions
+in :meth:`object.__getattr__` in :mod:`traceback`.