mirror of https://github.com/python/cpython.git
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())
|
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 test_name_error_suggestions_do_not_trigger_for_too_many_locals(self):
|
||||||
def f():
|
def f():
|
||||||
# Mutating locals() is unreliable, so we need to do it by hand
|
# Mutating locals() is unreliable, so we need to do it by hand
|
||||||
|
@ -1661,6 +1716,63 @@ class A:
|
||||||
|
|
||||||
self.assertNotIn("blech", err.getvalue())
|
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):
|
def test_getattr_suggestions_do_not_trigger_for_big_dicts(self):
|
||||||
class A:
|
class A:
|
||||||
blech = None
|
blech = None
|
||||||
|
|
|
@ -102,7 +102,10 @@ calculate_suggestions(PyObject *dir,
|
||||||
if (current_distance == -1) {
|
if (current_distance == -1) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (current_distance == 0 || current_distance > MAX_DISTANCE) {
|
if (current_distance == 0 ||
|
||||||
|
current_distance > MAX_DISTANCE ||
|
||||||
|
current_distance * 2 > name_size)
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!suggestion || current_distance < suggestion_distance) {
|
if (!suggestion || current_distance < suggestion_distance) {
|
||||||
|
|
Loading…
Reference in New Issue