Split function signature into its name, positional an optional arguments. The expected format is "func_name(arg, opt_arg=False)". Return the name of function and lists of positional and optional argument names.
(sig: str)
| 442 | |
| 443 | |
| 444 | def parse_signature(sig: str) -> tuple[str, list[str], list[str]] | None: |
| 445 | """Split function signature into its name, positional an optional arguments. |
| 446 | |
| 447 | The expected format is "func_name(arg, opt_arg=False)". Return the name of function |
| 448 | and lists of positional and optional argument names. |
| 449 | """ |
| 450 | m = re.match(r"([.a-zA-Z0-9_]+)\(([^)]*)\)", sig) |
| 451 | if not m: |
| 452 | return None |
| 453 | name = m.group(1) |
| 454 | name = name.split(".")[-1] |
| 455 | arg_string = m.group(2) |
| 456 | if not arg_string.strip(): |
| 457 | # Simple case -- no arguments. |
| 458 | return name, [], [] |
| 459 | |
| 460 | args = [arg.strip() for arg in arg_string.split(",")] |
| 461 | positional = [] |
| 462 | optional = [] |
| 463 | i = 0 |
| 464 | while i < len(args): |
| 465 | # Accept optional arguments as in both formats: x=None and [x]. |
| 466 | if args[i].startswith("[") or "=" in args[i]: |
| 467 | break |
| 468 | positional.append(args[i].rstrip("[")) |
| 469 | i += 1 |
| 470 | if args[i - 1].endswith("["): |
| 471 | break |
| 472 | while i < len(args): |
| 473 | arg = args[i] |
| 474 | arg = arg.strip("[]") |
| 475 | arg = arg.split("=")[0] |
| 476 | optional.append(arg) |
| 477 | i += 1 |
| 478 | return name, positional, optional |
| 479 | |
| 480 | |
| 481 | def build_signature(positional: Sequence[str], optional: Sequence[str]) -> str: |
searching dependent graphs…