Skip to content

Commit 91036ac

Browse files
committed
Use default values for annotate functions' __globals__, __builtins__, __defaults__, and __kwdefaults__
1 parent 128d316 commit 91036ac

File tree

1 file changed

+13
-9
lines changed

1 file changed

+13
-9
lines changed

Lib/annotationlib.py

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,9 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False):
711711
return annotate(format)
712712
except NotImplementedError:
713713
pass
714+
715+
annotate_defaults = getattr(annotate, "__defaults__", None)
716+
annotate_kwdefaults = getattr(annotate, "__kwdefaults__", None)
714717
if format == Format.STRING:
715718
# STRING is implemented by calling the annotate function in a special
716719
# environment where every name lookup results in an instance of _Stringifier.
@@ -740,8 +743,8 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False):
740743
annotate.__code__,
741744
globals,
742745
closure=closure,
743-
argdefs=annotate.__defaults__,
744-
kwdefaults=annotate.__kwdefaults__,
746+
argdefs=annotate_defaults,
747+
kwdefaults=annotate_kwdefaults,
745748
)
746749
annos = func(Format.VALUE_WITH_FAKE_GLOBALS)
747750
if _is_evaluate:
@@ -768,11 +771,12 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False):
768771
# reconstruct the source. But in the dictionary that we eventually return, we
769772
# want to return objects with more user-friendly behavior, such as an __eq__
770773
# that returns a bool and an defined set of attributes.
771-
namespace = {**annotate.__builtins__, **annotate.__globals__}
774+
annotate_globals = getattr(annotate, "__globals__", {})
775+
namespace = {**getattr(annotate, "__builtins__", builtins.__dict__), **annotate_globals}
772776
is_class = isinstance(owner, type)
773777
globals = _StringifierDict(
774778
namespace,
775-
globals=annotate.__globals__,
779+
globals=annotate_globals,
776780
owner=owner,
777781
is_class=is_class,
778782
format=format,
@@ -784,8 +788,8 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False):
784788
annotate.__code__,
785789
globals,
786790
closure=closure,
787-
argdefs=annotate.__defaults__,
788-
kwdefaults=annotate.__kwdefaults__,
791+
argdefs=annotate_defaults,
792+
kwdefaults=annotate_kwdefaults,
789793
)
790794
try:
791795
result = func(Format.VALUE_WITH_FAKE_GLOBALS)
@@ -802,7 +806,7 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False):
802806
# a value in certain cases where an exception gets raised during evaluation.
803807
globals = _StringifierDict(
804808
{},
805-
globals=annotate.__globals__,
809+
globals=annotate_globals,
806810
owner=owner,
807811
is_class=is_class,
808812
format=format,
@@ -814,8 +818,8 @@ def call_annotate_function(annotate, format, *, owner=None, _is_evaluate=False):
814818
annotate.__code__,
815819
globals,
816820
closure=closure,
817-
argdefs=annotate.__defaults__,
818-
kwdefaults=annotate.__kwdefaults__,
821+
argdefs=annotate_defaults,
822+
kwdefaults=annotate_kwdefaults,
819823
)
820824
result = func(Format.VALUE_WITH_FAKE_GLOBALS)
821825
globals.transmogrify(cell_dict)

0 commit comments

Comments
 (0)