https://github.com/python/cpython/commit/0085c3ae8f067abd4f6540d0f6dd2fb13107618e
commit: 0085c3ae8f067abd4f6540d0f6dd2fb13107618e
branch: main
author: Serhiy Storchaka <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2024-05-06T15:53:15+03:00
summary:

gh-116871: Improve name suggestions in tracebacks (GH-116930)

Only include underscored names in name suggestions for AttributeError and
ImportError if the original name was underscored.

files:
A Misc/NEWS.d/next/Library/2024-03-17-18-24-23.gh-issue-116871.9uSl8M.rst
M Lib/test/test_traceback.py
M Lib/traceback.py

diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py
index 7e4851058e0109..5987ec382e6c85 100644
--- a/Lib/test/test_traceback.py
+++ b/Lib/test/test_traceback.py
@@ -3882,6 +3882,27 @@ class CaseChangeOverSubstitution:
             actual = self.get_suggestion(cls(), 'bluch')
             self.assertIn(suggestion, actual)
 
+    def test_getattr_suggestions_underscored(self):
+        class A:
+            bluch = None
+
+        self.assertIn("'bluch'", self.get_suggestion(A(), 'blach'))
+        self.assertIn("'bluch'", self.get_suggestion(A(), '_luch'))
+        self.assertIn("'bluch'", self.get_suggestion(A(), '_bluch'))
+
+        class B:
+            _bluch = None
+            def method(self, name):
+                getattr(self, name)
+
+        self.assertIn("'_bluch'", self.get_suggestion(B(), '_blach'))
+        self.assertIn("'_bluch'", self.get_suggestion(B(), '_luch'))
+        self.assertNotIn("'_bluch'", self.get_suggestion(B(), 'bluch'))
+
+        self.assertIn("'_bluch'", self.get_suggestion(partial(B().method, 
'_blach')))
+        self.assertIn("'_bluch'", self.get_suggestion(partial(B().method, 
'_luch')))
+        self.assertIn("'_bluch'", self.get_suggestion(partial(B().method, 
'bluch')))
+
     def test_getattr_suggestions_do_not_trigger_for_long_attributes(self):
         class A:
             blech = None
@@ -4074,6 +4095,17 @@ def test_import_from_suggestions(self):
             actual = self.get_import_from_suggestion(code, 'bluch')
             self.assertIn(suggestion, actual)
 
+    def test_import_from_suggestions_underscored(self):
+        code = "bluch = None"
+        self.assertIn("'bluch'", self.get_import_from_suggestion(code, 
'blach'))
+        self.assertIn("'bluch'", self.get_import_from_suggestion(code, 
'_luch'))
+        self.assertIn("'bluch'", self.get_import_from_suggestion(code, 
'_bluch'))
+
+        code = "_bluch = None"
+        self.assertIn("'_bluch'", self.get_import_from_suggestion(code, 
'_blach'))
+        self.assertIn("'_bluch'", self.get_import_from_suggestion(code, 
'_luch'))
+        self.assertNotIn("'_bluch'", self.get_import_from_suggestion(code, 
'bluch'))
+
     def test_import_from_suggestions_do_not_trigger_for_long_attributes(self):
         code = "blech = None"
 
diff --git a/Lib/traceback.py b/Lib/traceback.py
index 1878779e154d04..9401b461497cc1 100644
--- a/Lib/traceback.py
+++ b/Lib/traceback.py
@@ -1469,12 +1469,23 @@ def _compute_suggestion_error(exc_value, tb, 
wrong_name):
         obj = exc_value.obj
         try:
             d = dir(obj)
+            hide_underscored = (wrong_name[:1] != '_')
+            if hide_underscored and tb is not None:
+                while tb.tb_next is not None:
+                    tb = tb.tb_next
+                frame = tb.tb_frame
+                if 'self' in frame.f_locals and frame.f_locals['self'] is obj:
+                    hide_underscored = False
+            if hide_underscored:
+                d = [x for x in d if x[:1] != '_']
         except Exception:
             return None
     elif isinstance(exc_value, ImportError):
         try:
             mod = __import__(exc_value.name)
             d = dir(mod)
+            if wrong_name[:1] != '_':
+                d = [x for x in d if x[:1] != '_']
         except Exception:
             return None
     else:
diff --git 
a/Misc/NEWS.d/next/Library/2024-03-17-18-24-23.gh-issue-116871.9uSl8M.rst 
b/Misc/NEWS.d/next/Library/2024-03-17-18-24-23.gh-issue-116871.9uSl8M.rst
new file mode 100644
index 00000000000000..f3caa63187d78b
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2024-03-17-18-24-23.gh-issue-116871.9uSl8M.rst
@@ -0,0 +1,2 @@
+Name suggestions for :exc:`AttributeError` and :exc:`ImportError` now only
+include underscored names if the original name was underscored.

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to