Skip to content

Commit d94498f

Browse files
committed
Better mirror what _json.c now does, but use a yielding generator instead of creating a PyList object.
1 parent 9ffe28b commit d94498f

1 file changed

Lines changed: 10 additions & 6 deletions

File tree

‎Lib/json/encoder.py‎

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,13 @@ def _coerce_key(key):
355355
raise TypeError(f'keys must be str, int, float, bool or None, '
356356
f'not {key.__class__.__name__}')
357357

358+
def _coerce_items(items):
359+
for (k,v) in items:
360+
k = _coerce_key(k) # Coerce or throw
361+
if k is None:
362+
continue
363+
yield (k,v)
364+
358365
if not dct:
359366
yield '{}'
360367
return
@@ -374,16 +381,13 @@ def _coerce_key(key):
374381
item_separator = _item_separator
375382
first = True
376383

377-
# Coerce keys to strings (or None if _skipkeys)
378-
items = ((_coerce_key(k), v) for (k,v) in dct.items())
384+
# Coerce keys to strings
385+
items = _coerce_items(dct.items())
379386

380387
if _sort_keys:
381-
items = sorted((k,v) for (k,v) in items if k is not None)
388+
items = sorted(items)
382389

383390
for key, value in items:
384-
if key is None:
385-
# If specified, skip keys that we weren't able to coerce to strings
386-
continue
387391
if first:
388392
first = False
389393
else:

0 commit comments

Comments
 (0)