mirror of
https://github.com/python/cpython
synced 2024-09-16 01:45:23 +00:00
bpo-38530: Require 50% similarity in NameError and AttributeError suggestions (GH-25584)
This commit is contained in:
parent
7244c0060d
commit
284c52da09
|
@ -1507,6 +1507,61 @@ def f():
|
|||
|
||||
self.assertNotIn("somethingverywronghehe", err.getvalue())
|
||||
|
||||
def test_name_error_bad_suggestions_do_not_trigger_for_small_names(self):
|
||||
vvv = mom = w = id = pytho = None
|
||||
|
||||
with self.subTest(name="b"):
|
||||
try:
|
||||
b
|
||||
except NameError as exc:
|
||||
with support.captured_stderr() as err:
|
||||
sys.__excepthook__(*sys.exc_info())
|
||||
self.assertNotIn("you mean", err.getvalue())
|
||||
self.assertNotIn("vvv", err.getvalue())
|
||||
self.assertNotIn("mom", err.getvalue())
|
||||
self.assertNotIn("'id'", err.getvalue())
|
||||
self.assertNotIn("'w'", err.getvalue())
|
||||
self.assertNotIn("'pytho'", err.getvalue())
|
||||
|
||||
with self.subTest(name="v"):
|
||||
try:
|
||||
v
|
||||
except NameError as exc:
|
||||
with support.captured_stderr() as err:
|
||||
sys.__excepthook__(*sys.exc_info())
|
||||
self.assertNotIn("you mean", err.getvalue())
|
||||
self.assertNotIn("vvv", err.getvalue())
|
||||
self.assertNotIn("mom", err.getvalue())
|
||||
self.assertNotIn("'id'", err.getvalue())
|
||||
self.assertNotIn("'w'", err.getvalue())
|
||||
self.assertNotIn("'pytho'", err.getvalue())
|
||||
|
||||
with self.subTest(name="m"):
|
||||
try:
|
||||
m
|
||||
except NameError as exc:
|
||||
with support.captured_stderr() as err:
|
||||
sys.__excepthook__(*sys.exc_info())
|
||||
self.assertNotIn("you mean", err.getvalue())
|
||||
self.assertNotIn("vvv", err.getvalue())
|
||||
self.assertNotIn("mom", err.getvalue())
|
||||
self.assertNotIn("'id'", err.getvalue())
|
||||
self.assertNotIn("'w'", err.getvalue())
|
||||
self.assertNotIn("'pytho'", err.getvalue())
|
||||
|
||||
with self.subTest(name="py"):
|
||||
try:
|
||||
py
|
||||
except NameError as exc:
|
||||
with support.captured_stderr() as err:
|
||||
sys.__excepthook__(*sys.exc_info())
|
||||
self.assertNotIn("you mean", err.getvalue())
|
||||
self.assertNotIn("vvv", err.getvalue())
|
||||
self.assertNotIn("mom", err.getvalue())
|
||||
self.assertNotIn("'id'", err.getvalue())
|
||||
self.assertNotIn("'w'", err.getvalue())
|
||||
self.assertNotIn("'pytho'", err.getvalue())
|
||||
|
||||
def test_name_error_suggestions_do_not_trigger_for_too_many_locals(self):
|
||||
def f():
|
||||
# Mutating locals() is unreliable, so we need to do it by hand
|
||||
|
@ -1661,6 +1716,63 @@ class A:
|
|||
|
||||
self.assertNotIn("blech", err.getvalue())
|
||||
|
||||
def test_getattr_error_bad_suggestions_do_not_trigger_for_small_names(self):
|
||||
class MyClass:
|
||||
vvv = mom = w = id = pytho = None
|
||||
|
||||
with self.subTest(name="b"):
|
||||
try:
|
||||
MyClass.b
|
||||
except AttributeError as exc:
|
||||
with support.captured_stderr() as err:
|
||||
sys.__excepthook__(*sys.exc_info())
|
||||
self.assertNotIn("you mean", err.getvalue())
|
||||
self.assertNotIn("vvv", err.getvalue())
|
||||
self.assertNotIn("mom", err.getvalue())
|
||||
self.assertNotIn("'id'", err.getvalue())
|
||||
self.assertNotIn("'w'", err.getvalue())
|
||||
self.assertNotIn("'pytho'", err.getvalue())
|
||||
|
||||
with self.subTest(name="v"):
|
||||
try:
|
||||
MyClass.v
|
||||
except AttributeError as exc:
|
||||
with support.captured_stderr() as err:
|
||||
sys.__excepthook__(*sys.exc_info())
|
||||
self.assertNotIn("you mean", err.getvalue())
|
||||
self.assertNotIn("vvv", err.getvalue())
|
||||
self.assertNotIn("mom", err.getvalue())
|
||||
self.assertNotIn("'id'", err.getvalue())
|
||||
self.assertNotIn("'w'", err.getvalue())
|
||||
self.assertNotIn("'pytho'", err.getvalue())
|
||||
|
||||
with self.subTest(name="m"):
|
||||
try:
|
||||
MyClass.m
|
||||
except AttributeError as exc:
|
||||
with support.captured_stderr() as err:
|
||||
sys.__excepthook__(*sys.exc_info())
|
||||
self.assertNotIn("you mean", err.getvalue())
|
||||
self.assertNotIn("vvv", err.getvalue())
|
||||
self.assertNotIn("mom", err.getvalue())
|
||||
self.assertNotIn("'id'", err.getvalue())
|
||||
self.assertNotIn("'w'", err.getvalue())
|
||||
self.assertNotIn("'pytho'", err.getvalue())
|
||||
|
||||
with self.subTest(name="py"):
|
||||
try:
|
||||
MyClass.py
|
||||
except AttributeError as exc:
|
||||
with support.captured_stderr() as err:
|
||||
sys.__excepthook__(*sys.exc_info())
|
||||
self.assertNotIn("you mean", err.getvalue())
|
||||
self.assertNotIn("vvv", err.getvalue())
|
||||
self.assertNotIn("mom", err.getvalue())
|
||||
self.assertNotIn("'id'", err.getvalue())
|
||||
self.assertNotIn("'w'", err.getvalue())
|
||||
self.assertNotIn("'pytho'", err.getvalue())
|
||||
|
||||
|
||||
def test_getattr_suggestions_do_not_trigger_for_big_dicts(self):
|
||||
class A:
|
||||
blech = None
|
||||
|
|
|
@ -102,7 +102,10 @@ calculate_suggestions(PyObject *dir,
|
|||
if (current_distance == -1) {
|
||||
return NULL;
|
||||
}
|
||||
if (current_distance == 0 || current_distance > MAX_DISTANCE) {
|
||||
if (current_distance == 0 ||
|
||||
current_distance > MAX_DISTANCE ||
|
||||
current_distance * 2 > name_size)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (!suggestion || current_distance < suggestion_distance) {
|
||||
|
|
Loading…
Reference in a new issue