|
80 | 80 | Literal, |
81 | 81 | Optional, |
82 | 82 | Mapping, |
| 83 | + NotRequired, |
83 | 84 | Union, |
84 | 85 | Tuple, |
85 | 86 | TypedDict, |
@@ -507,7 +508,9 @@ def extract_props(tpe: RiverType) -> list[dict[str, RiverType]]: |
507 | 508 | encoder_names.add(encoder_name) |
508 | 509 | typeddict_encoder.append(f"{encoder_name}(x[{repr(name)}])") |
509 | 510 | if name not in type.required: |
510 | | - typeddict_encoder.append(f"if x[{repr(name)}] else None") |
| 511 | + typeddict_encoder.append( |
| 512 | + f"if {repr(name)} in x and x[{repr(name)}] else None" |
| 513 | + ) |
511 | 514 | elif isinstance(prop, RiverIntersectionType): |
512 | 515 | encoder_name = TypeName( |
513 | 516 | f"encode_{ensure_literal_type(type_name)}" |
@@ -541,7 +544,12 @@ def extract_props(tpe: RiverType) -> list[dict[str, RiverType]]: |
541 | 544 | items = cast(RiverConcreteType, prop).items |
542 | 545 | assert items, "Somehow items was none" |
543 | 546 | if is_literal(cast(RiverType, items)): |
544 | | - typeddict_encoder.append(f"x[{repr(name)}]") |
| 547 | + if name in prop.required: |
| 548 | + typeddict_encoder.append(f"x[{repr(name)}]") |
| 549 | + else: |
| 550 | + typeddict_encoder.append( |
| 551 | + f"x.get({repr(safe_name)})" |
| 552 | + ) |
545 | 553 | else: |
546 | 554 | match type_name: |
547 | 555 | case ListTypeExpr(inner_type_name): |
@@ -606,12 +614,24 @@ def extract_props(tpe: RiverType) -> list[dict[str, RiverType]]: |
606 | 614 | ) |
607 | 615 | else: |
608 | 616 | if name not in type.required: |
609 | | - value = "" |
610 | | - if base_model != "TypedDict": |
611 | | - value = " = None" |
612 | | - current_chunks.append( |
613 | | - f" {name}: Optional[{render_type_expr(type_name)}]{value}" |
614 | | - ) |
| 617 | + if base_model == "TypedDict": |
| 618 | + current_chunks.append( |
| 619 | + reindent( |
| 620 | + " ", |
| 621 | + f"""\ |
| 622 | + {name}: NotRequired[Optional[{render_type_expr(type_name)}]] |
| 623 | + """, |
| 624 | + ) |
| 625 | + ) |
| 626 | + else: |
| 627 | + current_chunks.append( |
| 628 | + reindent( |
| 629 | + " ", |
| 630 | + f"""\ |
| 631 | + {name}: Optional[{render_type_expr(type_name)}] = None |
| 632 | + """, |
| 633 | + ) |
| 634 | + ) |
615 | 635 | else: |
616 | 636 | current_chunks.append( |
617 | 637 | f" {name}: {render_type_expr(type_name)}" |
|
0 commit comments