gh-98878: Use builtins from the bound frame when offering a suggestion (#98880)

This commit is contained in:
Batuhan Taskaya 2022-10-31 16:27:13 +03:00 committed by GitHub
parent 39448adc9d
commit a41de32942
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 12 additions and 1 deletions

View File

@ -7,6 +7,7 @@ import sys
import types import types
import inspect import inspect
import importlib import importlib
import builtins
import unittest import unittest
import re import re
import tempfile import tempfile
@ -3209,6 +3210,14 @@ class SuggestionFormattingTestBase:
actual = self.get_suggestion(func) actual = self.get_suggestion(func)
self.assertIn("'ZeroDivisionError'?", actual) self.assertIn("'ZeroDivisionError'?", actual)
def test_name_error_suggestions_from_builtins_when_builtins_is_module(self):
def func():
custom_globals = globals().copy()
custom_globals["__builtins__"] = builtins
print(eval("ZeroDivisionErrrrr", custom_globals))
actual = self.get_suggestion(func)
self.assertIn("'ZeroDivisionError'?", actual)
def test_name_error_suggestions_do_not_trigger_for_long_names(self): def test_name_error_suggestions_do_not_trigger_for_long_names(self):
def func(): def func():
somethingverywronghehehehehehe = None somethingverywronghehehehehehe = None

View File

@ -1035,7 +1035,7 @@ def _compute_suggestion_error(exc_value, tb, wrong_name):
d = ( d = (
list(frame.f_locals) list(frame.f_locals)
+ list(frame.f_globals) + list(frame.f_globals)
+ list(frame.f_globals['__builtins__']) + list(frame.f_builtins)
) )
if len(d) > _MAX_CANDIDATE_ITEMS: if len(d) > _MAX_CANDIDATE_ITEMS:
return None return None

View File

@ -0,0 +1,2 @@
Use the frame bound builtins when offering a name suggestion in
:mod:`traceback` to prevent crashing when ``__builtins__`` is not a dict.