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

Ouverte
#101,332 3 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
2/5
Temps estimé
1-3 heures
Accessibilité débutants
38/100
Type d'issue
Documentation
Clarté
Plutôt claire
Activité
À l'abandon
Stack technique
python
Domaine
documentation

Piste de recherche

Commencez par la documentation liée de json.dump et la reproduction fournie, puis vérifiez comment default et cls interagissent. Le travail est terminé lorsque la documentation indique explicitement et précisément quel comportement s’applique lorsque les deux kwargs sont fournis, avec une formulation cohérente avec JSONEncoder.default().

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

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")
Langage dominant
Python
Étoiles
77.2k
Forks
36k
Merge moyen
1 j 9 h
PR mergées (30 j)
558

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de python/cpython

Toutes les issues de python/cpython

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.