mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	bpo-38530: Require 50% similarity in NameError and AttributeError suggestions (GH-25584)
This commit is contained in:
		
							parent
							
								
									7244c0060d
								
							
						
					
					
						commit
						284c52da09
					
				
					 2 changed files with 116 additions and 1 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Dennis Sweeney
						Dennis Sweeney