@@ -818,7 +818,7 @@ class ForwardRef(_Final, _root=True):
818
818
__slots__ = ('__forward_arg__' , '__forward_code__' ,
819
819
'__forward_evaluated__' , '__forward_value__' ,
820
820
'__forward_is_argument__' , '__forward_is_class__' ,
821
- '__forward_module__' )
821
+ '__forward_module__' , '__forward_is_unpack__' )
822
822
823
823
def __init__ (self , arg , is_argument = True , module = None , * , is_class = False ):
824
824
if not isinstance (arg , str ):
@@ -828,9 +828,11 @@ def __init__(self, arg, is_argument=True, module=None, *, is_class=False):
828
828
# Unfortunately, this isn't a valid expression on its own, so we
829
829
# do the unpacking manually.
830
830
if arg [0 ] == '*' :
831
- arg_to_compile = f'({ arg } ,)[0]' # E.g. (*Ts,)[0]
831
+ arg_to_compile = f'({ arg } ,)[0]' # E.g. (*Ts,)[0] or (tuple[int, int],)[0]
832
+ is_unpack = True
832
833
else :
833
834
arg_to_compile = arg
835
+ is_unpack = False
834
836
try :
835
837
code = compile (arg_to_compile , '<string>' , 'eval' )
836
838
except SyntaxError :
@@ -843,6 +845,7 @@ def __init__(self, arg, is_argument=True, module=None, *, is_class=False):
843
845
self .__forward_is_argument__ = is_argument
844
846
self .__forward_is_class__ = is_class
845
847
self .__forward_module__ = module
848
+ self .__forward_is_unpack__ = is_unpack
846
849
847
850
def _evaluate (self , globalns , localns , recursive_guard ):
848
851
if self .__forward_arg__ in recursive_guard :
@@ -867,6 +870,11 @@ def _evaluate(self, globalns, localns, recursive_guard):
867
870
self .__forward_value__ = _eval_type (
868
871
type_ , globalns , localns , recursive_guard | {self .__forward_arg__ }
869
872
)
873
+ if (
874
+ self .__forward_is_unpack__ and
875
+ not isinstance (self .__forward_value__ , _UnpackGenericAlias )
876
+ ):
877
+ self .__forward_value__ = Unpack [self .__forward_value__ ]
870
878
self .__forward_evaluated__ = True
871
879
return self .__forward_value__
872
880
@@ -1939,15 +1947,11 @@ def _no_init_or_replace_init(self, *args, **kwargs):
1939
1947
1940
1948
1941
1949
def _caller (depth = 1 , default = '__main__' ):
1942
- try :
1943
- return sys ._getframemodulename (depth + 1 ) or default
1944
- except AttributeError : # For platforms without _getframemodulename()
1945
- pass
1946
1950
try :
1947
1951
return sys ._getframe (depth + 1 ).f_globals .get ('__name__' , default )
1948
1952
except (AttributeError , ValueError ): # For platforms without _getframe()
1949
- pass
1950
- return None
1953
+ return None
1954
+
1951
1955
1952
1956
def _allow_reckless_class_checks (depth = 3 ):
1953
1957
"""Allow instance and class checks for special stdlib modules.
0 commit comments