|
18 | 18 | Type = OutputType
|
19 | 19 |
|
20 | 20 |
|
| 21 | +# If there are more than 2 optional positional only args, convert them all to variadic positional args |
| 22 | +MAX_OPTIONAL_POSITIONAL_ONLY_ARGS = 2 |
| 23 | + |
| 24 | + |
21 | 25 | def orjson_dumps(v, *, default):
|
22 | 26 | # orjson.dumps returns bytes, to match standard json.dumps we need to decode
|
23 | 27 | return orjson.dumps(v, default=default, option=orjson.OPT_INDENT_2).decode() # type: ignore
|
@@ -555,8 +559,29 @@ def __ior__(self, other: Signature) -> Signature:
|
555 | 559 | self._copy_var_kw(other)
|
556 | 560 |
|
557 | 561 | update_add(self.metadata, other.metadata)
|
| 562 | + self._trim_positional_only_args() |
558 | 563 | return self
|
559 | 564 |
|
| 565 | + def _trim_positional_only_args(self): |
| 566 | + """ |
| 567 | + If there are excss positional only args, move them to variable positional only args |
| 568 | + """ |
| 569 | + # if we already have var pos only args, remove all positional only args |
| 570 | + if ( |
| 571 | + self.var_pos |
| 572 | + or len(self.pos_only_optional) > MAX_OPTIONAL_POSITIONAL_ONLY_ARGS |
| 573 | + ): |
| 574 | + var_pos_output = unify( |
| 575 | + [ |
| 576 | + self.var_pos[1] if self.var_pos else BottomOutput(), |
| 577 | + *self.pos_only_optional.values(), |
| 578 | + ] |
| 579 | + ) |
| 580 | + var_pos_label = self.var_pos[0] if self.var_pos else "_args" |
| 581 | + self.var_pos = (var_pos_label, var_pos_output) |
| 582 | + self.pos_only_optional = {} |
| 583 | + self.pos_only_optional_ordering = [] |
| 584 | + |
560 | 585 | def _copy_pos_only(self, other: Signature) -> None:
|
561 | 586 | pos_only_required = dict(
|
562 | 587 | map(
|
|
0 commit comments