Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

from_dict raises when nullable ref is set to None

Ouverte
#679 7 commentaires 13 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
4/5
Temps estimé
3-5 jours
Accessibilité débutants
35/100
Type d'issue
Bug
Clarté
Plutôt claire
Activité
À l'abandon
Stack technique
openapi, python
Domaine
tooling

Piste de recherche

Commence par inspecter les fichiers générés myapp_client/models/my_object.py et my_child_object.py, en particulier le chemin from_dict indiqué dans le rapport, puis suis le code du générateur qui le produit. Compare la gestion des scalaires nullable avec la gestion des $ref nullable. C’est terminé lorsque from_dict accepte une valeur None pour myRef sans appeler MyChildObject.from_dict(None), tout en préservant le comportement de UNSET.

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

Description

🐞bug

Describe the bug
from_dict when we set a nullable field ref to None. This behavior:

  • differs from class constructor which accepts None ref fields
  • differs from others fields : from_dict accept nullable string, object, array, etc to be set to None

To Reproduce
Steps to reproduce the behavior:

  1. take the following swagger:
components:
  schemas:
    MyObject:
      properties:
        myId:
          title: MyId
          type: string
          nullable: true
        myArray:
          title: MyArray
          type: array
          nullable: true
          items:
            type: string
        myString:
          title: MyString
          type: string
          nullable: true
        myObject:
          title: myObject
          type: object
          nullable: true
        myRef:
          $ref: '#/components/schemas/MyChildObject'
          nullable: true
      required:
        - myId
      title: MyObject
      type: object
    MyChildObject:
      properties:
        aField:
          items:
            type: string
          nullable: true
          title: AField
          type: array
      title: MyChildObject
      type: object
info:
  title: myapp
  version: 1.9.4a5
openapi: 3.0.2
paths:
  /myroute:
    get:
      parameters:
      requestBody:
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MyChildObject'
          description: Successful Response
  1. generate the client from this swagger
  2. run the following code snippet:
from myapp_client.models import MyObject, MyChildObject
MyObject(my_id="id", my_object=None, my_array=None, my_string=None, my_ref=None) # pass
MyObject.from_dict({"myId":"id", "myObject": None, "myArray": None, "myString": None, "myRef": None}) # raise
MyObject.from_dict({"myId":"id", "myObject": None, "myArray": None, "myString": None}) # pass
  1. See error
In [1]: from myapp_client.models import MyObject, MyChildObject

In [2]: MyObject(my_id="id", my_object=None, my_array=None, my_string=None, my_ref=None)
Out[2]: MyObject(my_id='id', my_array=None, my_string=None, my_object=None, my_ref=None, additional_properties={})

In [3]: MyObject.from_dict({"myId":"id", "myObject": None, "myArray": None, "myString": None, "myRef": None})
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In [3], line 1
----> 1 MyObject.from_dict({"myId":"id", "myObject": None, "myArray": None, "myString": None, "myRef": None})

File ~/CF/amp-client/myapp-client/myapp_client/models/my_object.py:89, in MyObject.from_dict(cls, src_dict)
     87     my_ref = UNSET
     88 else:
---> 89     my_ref = MyChildObject.from_dict(_my_ref)
     91 my_object = cls(
     92     my_id=my_id,
     93     my_array=my_array,
   (...)
     96     my_ref=my_ref,
     97 )
     99 my_object.additional_properties = d

File ~/CF/amp-client/myapp-client/myapp_client/models/my_child_object.py:38, in MyChildObject.from_dict(cls, src_dict)
     36 @classmethod
     37 def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
---> 38     d = src_dict.copy()
     39     a_field = cast(List[str], d.pop("aField", UNSET))
     41     my_child_object = cls(
     42         a_field=a_field,
     43     )

AttributeError: 'NoneType' object has no attribute 'copy'

In [4]: MyObject.from_dict({"myId":"id", "myObject": None, "myArray": None, "myString": None})
Out[4]: MyObject(my_id='id', my_array=None, my_string=None, my_object=None, my_ref=<myapp_client.types.Unset object at 0x7f9f73a4f8e0>, additional_properties={})

In [5]: MyObject.from_dict({"myId":"id", "myObject": None, "myArray": None, "myString": None})

Expected behavior
We expect MyObject.from_dict({"myId":"id", "myObject": None, "myArray": None, "myString": None, "myRef": None}) to run without errors.

Some debug
having a look in the debugger, it raises there::

        _my_ref = d.pop("myRef", UNSET)
        my_ref: Union[Unset, MyChildObject]
        if isinstance(_my_ref, Unset):
            my_ref = UNSET
        else:
->          my_ref = MyChildObject.from_dict(_my_ref)

The code generated should rather look like:

        _my_ref = d.pop("myRef", UNSET)
        my_ref: Union[Unset, None, MyChildObject]
        if _my_ref is None:
            my_ref = None
        elif isinstance(_my_ref, Unset):
            my_ref = UNSET
        else:
            my_ref = MyChildObject.from_dict(_my_ref)
Langage dominant
Python
Étoiles
2k
Forks
293
Merge moyen
34 min
PR mergées (30 j)
1

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 openapi-generators/openapi-python-client

Toutes les issues de openapi-generators/openapi-python-client

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.