summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPablo Galindo Salgado <Pablogsal@gmail.com>2021-07-16 20:58:21 (GMT)
committerGitHub <noreply@github.com>2021-07-16 20:58:21 (GMT)
commit6714dec5e104bdee4a0ed4d9966de27d1bfa1e3d (patch)
treeb243c5db97cf18198e8a080e400edd9b06c34f03
parentc90c591e5158ab7b531dcd6e2a5f00bc70ba7637 (diff)
downloadcpython-6714dec5e104bdee4a0ed4d9966de27d1bfa1e3d.zip
cpython-6714dec5e104bdee4a0ed4d9966de27d1bfa1e3d.tar.gz
cpython-6714dec5e104bdee4a0ed4d9966de27d1bfa1e3d.tar.bz2
bpo-44655: Don't include suggestions for attributes that are the same as the missing one (GH-27197)
-rw-r--r--Lib/test/test_exceptions.py12
-rw-r--r--Misc/NEWS.d/next/Core and Builtins/2021-07-16-20-25-37.bpo-44655.I3wRjL.rst2
-rw-r--r--Python/suggestions.c3
3 files changed, 17 insertions, 0 deletions
diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py
index 2b00147..31051d4 100644
--- a/Lib/test/test_exceptions.py
+++ b/Lib/test/test_exceptions.py
@@ -1916,6 +1916,18 @@ class AttributeErrorTests(unittest.TestCase):
self.assertIn("blech", err.getvalue())
+ def test_getattr_suggestions_for_same_name(self):
+ class A:
+ def __dir__(self):
+ return ['blech']
+ try:
+ A().blech
+ except AttributeError as exc:
+ with support.captured_stderr() as err:
+ sys.__excepthook__(*sys.exc_info())
+
+ self.assertNotIn("Did you mean", err.getvalue())
+
def test_attribute_error_with_failing_dict(self):
class T:
bluch = 1
diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-07-16-20-25-37.bpo-44655.I3wRjL.rst b/Misc/NEWS.d/next/Core and Builtins/2021-07-16-20-25-37.bpo-44655.I3wRjL.rst
new file mode 100644
index 0000000..4ea4a6d
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2021-07-16-20-25-37.bpo-44655.I3wRjL.rst
@@ -0,0 +1,2 @@
+Don't include a missing attribute with the same name as the failing one when
+offering suggestions for missing attributes. Patch by Pablo Galindo
diff --git a/Python/suggestions.c b/Python/suggestions.c
index 3dfcbfe..77bdb6c 100644
--- a/Python/suggestions.c
+++ b/Python/suggestions.c
@@ -151,6 +151,9 @@ calculate_suggestions(PyObject *dir,
if (item_str == NULL) {
return NULL;
}
+ if (PyUnicode_CompareWithASCIIString(name, item_str) == 0) {
+ continue;
+ }
// No more than 1/3 of the involved characters should need changed.
Py_ssize_t max_distance = (name_size + item_size + 3) * MOVE_COST / 6;
// Don't take matches we've already beaten.