Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cover omit_defaults handling in asdict and to_builtins documentation #778

Open
ncoghlan opened this issue Dec 3, 2024 · 2 comments · May be fixed by #780
Open

Cover omit_defaults handling in asdict and to_builtins documentation #778

ncoghlan opened this issue Dec 3, 2024 · 2 comments · May be fixed by #780

Comments

@ncoghlan
Copy link

ncoghlan commented Dec 3, 2024

Description

(I'm not sure if this is a bug report or a feature request, so I opted for a feature request in case the current behaviour is intentional)

I am using msgspec to help communicate with a server where a boolean field can be set to None in the data model not because null is a valid value, but because it is permitted to omit the key entirely. The relevant struct has omit_defaults=True set accordingly.

However, msgspec isn't handling the full message serialisation (httpx is doing that), so I attempted to use asdict to generate the message spec portion of the message.

This failed, as asdict includes all fields, without paying attention to omit_defaults.

@ncoghlan ncoghlan changed the title asdict should respect omit_defaults Feature: add alternative API to asdict that respects omit_defaults Dec 5, 2024
@ncoghlan ncoghlan changed the title Feature: add alternative API to asdict that respects omit_defaults Cover omit_defaults handling in asdict and to_builtins documentation Dec 5, 2024
@ncoghlan
Copy link
Author

ncoghlan commented Dec 5, 2024

After exploring the docs further, I discovered that the "recursively convert to builtin types, while respecting omit_defaults" API exists: it is to_builtins.

Neither msgspec.struct.asdict nor msgspec.to_builtins mention omit_defaults in their documentation, so even though they have "See also" links to each other, it isn't clear why you might choose one over the other. (#748 is another example of someone hitting a similar point of confusion).

The other thing that tripped me up was that https://jcristharif.com/msgspec/usage.html doesn't cover the non-serialisation case, so the fact that msgspec.to_builtins is the encoding equivalent and msgspec.convert is the decoding equivalent wasn't immediately apparent.

I'll create a PR with some suggested docs tweaks.

ncoghlan added a commit to ncoghlan/msgspec that referenced this issue Dec 5, 2024
Also clarify differences between `to_builtins` and `asdict`.

Closes jcrist#778
@ncoghlan ncoghlan linked a pull request Dec 5, 2024 that will close this issue
@ncoghlan
Copy link
Author

ncoghlan commented Dec 5, 2024

#780 attempts to cover the points above in both the main usage docs, as well as in the docstrings of to_builtins and asdict.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant