66from abc import abstractmethod
77from collections import defaultdict
88from collections .abc import Iterator , Sequence
9- from enum import Enum , unique
10- from typing import TYPE_CHECKING , Any , Callable , Final , Optional , TypeVar , Union , cast
9+ from typing import (
10+ TYPE_CHECKING ,
11+ Any ,
12+ Callable ,
13+ ClassVar ,
14+ Final ,
15+ Optional ,
16+ TypeVar ,
17+ Union ,
18+ cast ,
19+ final ,
20+ )
1121from typing_extensions import TypeAlias as _TypeAlias , TypeGuard
1222
1323from mypy_extensions import trait
@@ -873,7 +883,7 @@ def serialize(self) -> JsonDict:
873883 "name" : self ._name ,
874884 "fullname" : self ._fullname ,
875885 "arg_names" : self .arg_names ,
876- "arg_kinds" : [int ( x .value ) for x in self .arg_kinds ],
886+ "arg_kinds" : [x .value for x in self .arg_kinds ],
877887 "type" : None if self .type is None else self .type .serialize (),
878888 "flags" : get_flags (self , FUNCDEF_FLAGS ),
879889 "abstract_status" : self .abstract_status ,
@@ -904,7 +914,7 @@ def deserialize(cls, data: JsonDict) -> FuncDef:
904914 set_flags (ret , data ["flags" ])
905915 # NOTE: ret.info is set in the fixup phase.
906916 ret .arg_names = data ["arg_names" ]
907- ret .arg_kinds = [ArgKind (x ) for x in data ["arg_kinds" ]]
917+ ret .arg_kinds = [ArgKind . by_value (x ) for x in data ["arg_kinds" ]]
908918 ret .abstract_status = data ["abstract_status" ]
909919 ret .dataclass_transform_spec = (
910920 DataclassTransformSpec .deserialize (data ["dataclass_transform_spec" ])
@@ -1963,21 +1973,35 @@ def accept(self, visitor: ExpressionVisitor[T]) -> T:
19631973 return visitor .visit_member_expr (self )
19641974
19651975
1966- # Kinds of arguments
1967- @unique
1968- class ArgKind (Enum ):
1969- # Positional argument
1970- ARG_POS = 0
1971- # Positional, optional argument (functions only, not calls)
1972- ARG_OPT = 1
1973- # *arg argument
1974- ARG_STAR = 2
1975- # Keyword argument x=y in call, or keyword-only function arg
1976- ARG_NAMED = 3
1977- # **arg argument
1978- ARG_STAR2 = 4
1979- # In an argument list, keyword-only and also optional
1980- ARG_NAMED_OPT = 5
1976+ @final
1977+ class ArgKind :
1978+ """Kinds of arguments.
1979+
1980+ NOTE: This isn't an enum due to mypyc performance limitations.
1981+ """
1982+
1983+ _sealed : ClassVar [bool ] = False # Hack to ensure enum-like behavior
1984+
1985+ def __init__ (self , name : str , value : int ) -> None :
1986+ assert not ArgKind ._sealed
1987+ self .name : Final = name
1988+ self .value : Final = value
1989+
1990+ @staticmethod
1991+ def by_value (value : int ) -> ArgKind :
1992+ if value == ARG_POS .value :
1993+ return ARG_POS
1994+ elif value == ARG_OPT .value :
1995+ return ARG_OPT
1996+ elif value == ARG_STAR .value :
1997+ return ARG_STAR
1998+ elif value == ARG_NAMED .value :
1999+ return ARG_NAMED
2000+ elif value == ARG_STAR2 .value :
2001+ return ARG_STAR2
2002+ else :
2003+ assert value == ARG_NAMED_OPT .value
2004+ return ARG_NAMED_OPT
19812005
19822006 def is_positional (self , star : bool = False ) -> bool :
19832007 return self == ARG_POS or self == ARG_OPT or (star and self == ARG_STAR )
@@ -1995,12 +2019,29 @@ def is_star(self) -> bool:
19952019 return self == ARG_STAR or self == ARG_STAR2
19962020
19972021
1998- ARG_POS : Final = ArgKind .ARG_POS
1999- ARG_OPT : Final = ArgKind .ARG_OPT
2000- ARG_STAR : Final = ArgKind .ARG_STAR
2001- ARG_NAMED : Final = ArgKind .ARG_NAMED
2002- ARG_STAR2 : Final = ArgKind .ARG_STAR2
2003- ARG_NAMED_OPT : Final = ArgKind .ARG_NAMED_OPT
2022+ # Positional argument
2023+ ARG_POS : Final = ArgKind ("ARG_POS" , 0 )
2024+ # Positional, optional argument (functions only, not calls)
2025+ ARG_OPT : Final = ArgKind ("ARG_OPT" , 1 )
2026+ # *arg argument
2027+ ARG_STAR : Final = ArgKind ("ARG_STAR" , 2 )
2028+ # Keyword argument x=y in call, or keyword-only function arg
2029+ ARG_NAMED : Final = ArgKind ("ARG_NAMED" , 3 )
2030+ # **arg argument
2031+ ARG_STAR2 : Final = ArgKind ("ARG_STAR2" , 4 )
2032+ # In an argument list, keyword-only and also optional
2033+ ARG_NAMED_OPT : Final = ArgKind ("ARG_NAMED_OPT" , 5 )
2034+
2035+ ArgKind ._sealed = True # Make sure no new ArgKinds can be created
2036+
2037+ ALL_ARG_KINDS : Final [tuple [ArgKind , ...]] = (
2038+ ARG_POS ,
2039+ ARG_OPT ,
2040+ ARG_STAR ,
2041+ ARG_NAMED ,
2042+ ARG_STAR2 ,
2043+ ARG_NAMED_OPT ,
2044+ )
20042045
20052046
20062047class CallExpr (Expression ):
0 commit comments