MCPcopy
hub / github.com/python/mypy / parse_enum_call_args

Method parse_enum_call_args

mypy/semanal_enum.py:157–258  ·  view source on GitHub ↗

Parse arguments of an Enum call. Return a tuple of fields, values, was there an error.

(
        self, call: CallExpr, class_name: str
    )

Source from the content-addressed store, hash-verified

155 return info
156
157 def parse_enum_call_args(
158 self, call: CallExpr, class_name: str
159 ) -> tuple[str, list[str], list[Expression | None], bool]:
160 """Parse arguments of an Enum call.
161
162 Return a tuple of fields, values, was there an error.
163 """
164 args = call.args
165 if not all(arg_kind in [ARG_POS, ARG_NAMED] for arg_kind in call.arg_kinds):
166 return self.fail_enum_call_arg(f"Unexpected arguments to {class_name}()", call)
167 if len(args) < 2:
168 return self.fail_enum_call_arg(f"Too few arguments for {class_name}()", call)
169 if len(args) > 6:
170 return self.fail_enum_call_arg(f"Too many arguments for {class_name}()", call)
171 valid_name = [None, "value", "names", "module", "qualname", "type", "start"]
172 for arg_name in call.arg_names:
173 if arg_name not in valid_name:
174 self.fail_enum_call_arg(f'Unexpected keyword argument "{arg_name}"', call)
175 value, names = None, None
176 for arg_name, arg in zip(call.arg_names, args):
177 if arg_name == "value":
178 value = arg
179 if arg_name == "names":
180 names = arg
181 if value is None:
182 value = args[0]
183 if names is None:
184 names = args[1]
185 if not isinstance(value, StrExpr):
186 return self.fail_enum_call_arg(
187 f"{class_name}() expects a string literal as the first argument", call
188 )
189 new_class_name = value.value
190
191 items = []
192 values: list[Expression | None] = []
193 if isinstance(names, StrExpr):
194 fields = names.value
195 for field in fields.replace(",", " ").split():
196 items.append(field)
197 elif isinstance(names, (TupleExpr, ListExpr)):
198 seq_items = names.items
199 if is_StrExpr_list(seq_items):
200 items = [seq_item.value for seq_item in seq_items]
201 elif all(
202 isinstance(seq_item, (TupleExpr, ListExpr))
203 and len(seq_item.items) == 2
204 and isinstance(seq_item.items[0], StrExpr)
205 for seq_item in seq_items
206 ):
207 for seq_item in seq_items:
208 assert isinstance(seq_item, (TupleExpr, ListExpr))
209 name, value = seq_item.items
210 assert isinstance(name, StrExpr)
211 items.append(name.value)
212 values.append(value)
213 else:
214 return self.fail_enum_call_arg(

Callers 1

check_enum_callMethod · 0.95

Calls 10

fail_enum_call_argMethod · 0.95
is_StrExpr_listFunction · 0.90
get_proper_typeFunction · 0.90
allFunction · 0.85
lenFunction · 0.85
zipFunction · 0.85
isinstanceFunction · 0.85
splitMethod · 0.80
replaceMethod · 0.80
appendMethod · 0.80

Tested by

no test coverage detected