Skip to content

Commit b291ae9

Browse files
committed
add dynamic field example for optional fields
1 parent d582a7e commit b291ae9

1 file changed

Lines changed: 11 additions & 12 deletions

File tree

docs/complex-data-structures.md

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -177,22 +177,21 @@ VarStr.from_bytes_exact(b'\x03ABC')
177177
# )
178178
```
179179

180-
Here's an example that combines all of the above concepts into a single
181-
bitfield: a bitfield that contains a dynamically-sized list of `WeatherPacket`
182-
bitfields!
180+
The `dynamic_field` combinator is also useful for defining optional fields:
183181

184-
```python
182+
````python
185183
from __future__ import annotations
186184
import bydantic as bd
187185

188-
def discriminator(field: WeatherPacketList) -> bd.Field[list[WeatherPacket]]:
189-
return bd.list_field(
190-
bd.bitfield_field(WeatherPacket), field.n_packets
191-
)
186+
def discriminator(field: OptionalField) -> bd.Field[bytes | None]:
187+
if field.has_values:
188+
return bd.bytes_field(n_bytes = 8)
189+
else:
190+
return None
192191

193-
class WeatherPacketList(bd.BitField):
194-
n_packets: int = bd.uint_field(8)
195-
packets: list[WeatherPacket] = bd.dynamic_field(discriminator)
192+
class OptionalField(bd.Bitfield):
193+
has_values: bool = bd.bool_field()
194+
values: bytes | None = bd.dynamic_field(discriminator)
196195
```
197196

198197
## `dynamic_field` (discriminator variation 2)
@@ -224,7 +223,7 @@ def discriminator(
224223

225224
class FancyDynamic(bd.Bitfield):
226225
value: ChildField | bytes = bd.dynamic_field(discriminator)
227-
```
226+
````
228227

229228
Here's some deserialization examples of the `FancyDynamic` bitfield:
230229

0 commit comments

Comments
 (0)