| 
13 | 13 |     AnyType,  | 
14 | 14 |     CallableType,  | 
15 | 15 |     Instance,  | 
 | 16 | +    ParamSpecFlavor,  | 
16 | 17 |     ParamSpecType,  | 
17 | 18 |     ProperType,  | 
18 | 19 |     TupleType,  | 
@@ -245,6 +246,9 @@ def expand_actual_type(  | 
245 | 246 |                 return item  | 
246 | 247 |             elif isinstance(star_args_type, ParamSpecType):  | 
247 | 248 |                 # ParamSpec is valid in *args but it can't be unpacked.  | 
 | 249 | +                assert (  | 
 | 250 | +                    star_args_type.flavor == ParamSpecFlavor.ARGS  | 
 | 251 | +                ), f"ParamSpecType for *args should have ARGS flavor, got {star_args_type.flavor}"  | 
248 | 252 |                 return star_args_type  | 
249 | 253 |             else:  | 
250 | 254 |                 return AnyType(TypeOfAny.from_error)  | 
@@ -386,12 +390,17 @@ def parse_star_args_type(  | 
386 | 390 |     ) -> TupleType | IterableType | ParamSpecType | AnyType:  | 
387 | 391 |         """Parse the type of a ``*args`` argument.  | 
388 | 392 | 
  | 
389 |  | -        Returns one of TupleType, TupleInstance or AnyType.  | 
 | 393 | +        Returns one of TupleType, IterableType, ParamSpecType (ARGS flavor),  | 
 | 394 | +        or AnyType(TypeOfAny.from_error) if the type cannot be parsed or is invalid.  | 
390 | 395 |         """  | 
391 | 396 |         p_t = get_proper_type(typ)  | 
392 |  | -        if isinstance(p_t, (TupleType, ParamSpecType, AnyType)):  | 
 | 397 | +        if isinstance(p_t, (TupleType, AnyType)):  | 
393 | 398 |             # just return the type as-is  | 
394 | 399 |             return p_t  | 
 | 400 | +        elif isinstance(p_t, ParamSpecType):  | 
 | 401 | +            if p_t.flavor == ParamSpecFlavor.ARGS:  | 
 | 402 | +                return p_t  | 
 | 403 | +            return AnyType(TypeOfAny.from_error)  | 
395 | 404 |         elif isinstance(p_t, TypeVarTupleType):  | 
396 | 405 |             return self.parse_star_args_type(p_t.upper_bound)  | 
397 | 406 |         elif isinstance(p_t, UnionType):  | 
 | 
0 commit comments