IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

pickle et noms de classes


Sujet :

Python

  1. #1
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut pickle et noms de classes
    Bonjour,

    Je rencontre quelques difficultés avec pickle.

    1/ J'ai 3 modules:
    - Un module A qui définit la classe foo dont je veux pickle une instance (classe toute simple, pas de méthodes à part init() qui ne fait que définir des attributs d'instance).
    - Un module B, dans le meme package que A, qui ne me sert qu'à faire un test de pickle via une fonction save_load(): j'importe A et je pickle une instance foo(). Tout marche très bien jusqu'ici.
    - Un module C (dans un autre package) qui essaye de faire la même chose (i.e il appelle la fonction save_load() de B, qui essaye de pickle.load() ).

    Dans ce dernier cas, python me renvoie l'erreur "module A does not exist", alors que B import A. Voyez vous ce que je n'ai pas compris ?

    2/ Plus généralement, si j'ai pickle une instance de la classe C, mais que mon code évolue et que je n'ai plus de classe C (elle a été renommé), comment puis-je catcher l'erreur de pickle pour qu'il soit au moins capable de me renvoyer les données sous forme de dict (ou alternativement de créer la classe manquante).

    Merci d'avance

  2. #2
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    Si tu importes A dans B, puis B dans C, tu dois faire B.A pour accéder à A depuis C, non*?

    Pickle ne stocke aucune info de classe (à part le nom), donc une classe de ce nom doit être dispo au moment de l’unpickling. Mais ça peut très bien être un simple proxy défini localement, et fournissant une fonction __setstate__() qui se chargera de faire la conversion… Ou alors, tu définis une sous-classe de Unpickler, et tu surcharges sa fonction find_class() pour faire la conversion des noms…

  3. #3
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    Merci Mont29,

    Nickel pour le 2eme point.

    Pour le 1er par contre je ne comprends pas.
    En l’occurrence, j'importe également A dans C (et donc je n'utilise pas B.A). Mais on peut imaginer un cas ou l'objet que j'essaye de pickle soit crée ailleurs et renvoyé à C par une fonction quelconque, sans que C aie besoin d'importer A.

  4. #4
    Membre Expert

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Par défaut
    À la relecture, je crois que je n’avais pas bien compris ta question… Et je ne suis pas sûr de mieux la comprendre maintenant.

    Par exemple, l’erreur “module A does not exist”, elle est générée au moment du unpickling, c’est bien ça*? Dans ce cas, ça voudrait dire que la classe est enregistrée sous le nom A.foo, au moment du pickling, et que l’unpickling ne trouve pas le module A dans son espace de nom…

    Un peu de code aiderait peut-être à bien saisir la situation…

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Citation Envoyé par VV33D Voir le message
    En l’occurrence, j'importe également A dans C (et donc je n'utilise pas B.A). Mais on peut imaginer un cas ou l'objet que j'essaye de pickle soit crée ailleurs et renvoyé à C par une fonction quelconque, sans que C aie besoin d'importer A.
    Je ne comprends pas trop le cas d'utilisation (ou pourquoi Pickle dans ce cas?)

    Soit on fait "pickle" d'objets Python et il faut bien créer l'instance de...
    Soit on stocke le dict via par exemple du JSON et on fabrique une classe qui récupère le dict dans qqc. et on se retrouve dans une logique similaire à un ORM (les objets externes sont représentés "en interne" par).

    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Membre Expert
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Par défaut
    Finalement, le problème vient d'un from...import A (dans le module B). Ça marche en mettant un import absolu a la place: import ...A
    @wiztricks: Je voulais simplement dire que l'instance de l'objet peut avoir été crée par une fonction importée, sans que l'on aie directement importé dans C le .py ou la classe est définie.
    @mont29: correction, j'importe bien B et non A dans C, mais je n'utilise pas B.A dans C car C ne fait que unpickle (en appelant la fonction B.load_data())

    Merci a vous tous pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/01/2007, 05h46
  2. Que veut dire le "T" devant un nom de classe?
    Par Jhulk dans le forum Delphi
    Réponses: 5
    Dernier message: 08/06/2006, 08h39
  3. Noms de classes identiques
    Par manu.c dans le forum Rational
    Réponses: 13
    Dernier message: 05/04/2006, 14h51
  4. Passer un text comme un nom de classe
    Par marie253 dans le forum Langage
    Réponses: 5
    Dernier message: 19/07/2004, 11h22
  5. [Chargement de classe][noms de classe relatifs]
    Par freudy dans le forum Langage
    Réponses: 5
    Dernier message: 21/04/2004, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo