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
Replace NaN/Infinity with null #4908
Merged
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a little bit scary as it was set to False explicitly in the past, probably for a reason. I'm guessing the default is
True
and someone set it toFalse
for some specific reason. We should do a bit of git forensics to understand how it came to be.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah. This is super confusing naming. Just to clarify:
allow_nan=False
: will raise an exception if the data has NaN/Infinity;ignore_nan=True
: will encode NaN/Infinity as nulls.I'm assuming what happened was that someone had an async query returning NaN/Infinity, and since the stdlib
json
module does not have theignore_nan
argument the easiest way is to work around is to raise an exception here. It took me a while to learn thatsimplejson
had this option.I looked at the blame and couldn't find any info about this. The reason I changed this as well was to make it consistent with the sync call.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Digging in a bit more, I found the first commit where this was introduced by some guy called @mistercrunch: 38b8db805 :-P
Initially both sync and async responses used
allow_nan=False
. Eventually it got dropped from the sync response in 269f55c29 when the pessimistic encoder was introduced. The pessimistic encoder was not added to the async response because the commit is trying to fix gigantic HTML error messages, but IMHO it should've been added as well.The problem is that the pessimistic encoder doesn't handle
NaN
and±Infinity
because they're floats, so the JSON encoder never calls thedefault
method on them.I think the change above is safe — it will return some result instead of failing with a
ValueError
exception. But I think the best approach would be using a more robust serialization to send data to the browser, like BSON.