Undocumented interaction between kwargs default= and cls= for json.dump() function

Abierto
#101,332 3 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
38/100
Tipo de issue
Documentación
Claridad
Bastante claro
Estado de actividad
Estancado
Stack tecnológico
python

Línea de trabajo

Comienza con la documentación enlazada de json.dump y la reproducción proporcionada; después, verifica cómo interactúan default y cls. Se considera terminado cuando la documentación indica de forma explícita y precisa qué comportamiento se aplica cuando se proporcionan ambos kwargs, con una redacción coherente con JSONEncoder.default().

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

docs

Documentation

The current documentation states that "If specified, default should be a function that gets called for objects that can’t otherwise be serialized", and "To use a custom JSONEncoder subclass (e.g. one that overrides the default() method to serialize additional types), specify it with the cls kwarg" (emphasis mine).

This seems to imply that if both default and cls kwargs are provided, the custom JSONEncoder specified for cls will override the function specified for default. (Although honestly it is unclear from the wording what the exact behavior would be if both are specified, since "the default() method" could be referring to the one in the kwarg for dump() or the subclass override in the custom encoder class).

The observed behavior is that the opposite happens: the function specified in the default kwarg will actually override the default() function from the custom JSONEncoder.

Repro steps:

import json
from json import JSONEncoder
from datetime import datetime

class CustomEncoder(JSONEncoder):
    def default(self, o):
        return "foo"

print(json.dumps(datetime.fromisoformat("2023-01-24T12:35:14"), default=lambda x: "bar"))  # prints "bar", as expected
print(json.dumps(datetime.fromisoformat("2023-01-24T12:35:14"), cls=CustomEncoder))  # prints "foo", as expected
print(json.dumps(datetime.fromisoformat("2023-01-24T12:35:14"), cls=CustomEncoder, default=lambda x: "bar"))  # prints "bar" (but documentation seems to imply the _cls_ encoder would override the _default_ function and thus print "foo")
Lenguaje dominante
Python
Estrellas
77.2k
Forks
36k
Merge medio
1 d 9 h
PR fusionados (30 d)
558

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de python/cpython

Todos los issues de python/cpython

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.