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 :

attribute error : y-at-il un moyen de déclarer le type pour éviter cela


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    master2 math
    Inscrit en
    Mars 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : master2 math

    Informations forums :
    Inscription : Mars 2016
    Messages : 19
    Par défaut attribute error : y-at-il un moyen de déclarer le type pour éviter cela
    Bonjour,
    Dans "def", parfois j'ai ce message, et parfois pas...je ne sais pas exactement quand, car parfois je m'attends à ce qu'il me le mette, et tout se passe bien...

    exemple pROD(a,B) retourne une liste (de liste)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def PROD(A,B):
    	y=[]
    	for a in A:
    		y=y.extend(pROD(a,B))
    	return liset(y)
    pROD(a,B) retourne une liste (une liste de liste d'entier plus exactement), et Python le sait : pourtant lorsque je teste avec PROD(A,A) (A étant aussi une liste (de liste^^) que j'ai entrée) il m'envoie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> PROD(A,A)
    Traceback (most recent call last):
      File "<pyshell#293>", line 1, in <module>
        PROD(A,A)
      File "<pyshell#292>", line 4, in PROD
        y=y.extend(pROD(a,B))
    AttributeError: 'NoneType' object has no attribute 'extend'
    Peut-être qu'on peut déclarer le type avant?

    En tous cas, je serai très content de savoir si un chapître d'un tuto traîte de ça : j'ai beaucoup de mal à trouver sur google ou dans les tutos, (par contre je les lis de façon linéaire, et pour découvrir, au fil des pages il n'y a pas de soucis, c'est pour trouver une réponse à un problème que je n'ai pas rencontré que j'ai du mal...)

    Si vous voulez je donnerai des exemples de là où Python ne me dit pas "attribute errore" à ma grande surprise, mais je ne vais pas allordir le post qui est dejà long!!

    merci beaucoup!

  2. #2
    Membre averti
    Homme Profil pro
    master2 math
    Inscrit en
    Mars 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : master2 math

    Informations forums :
    Inscription : Mars 2016
    Messages : 19
    Par défaut
    quand je remplace "y.extend(pROD....)" par "y+pROD" ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> A=[[1,2,3],[1,3,6]]
    >>> def PROD(A,B):
    	y=[]
    	for a in A:
    		y=y+pROD(a,B)
    	return liset(y)
     
    >>> PROD(A,A)
    [[1, 9, 36], [1, 6, 18], [1, 4, 9]]
    >>>
    J'en perds un peu mon latin, enfin je parle pas latin, j'en perds pas mon Python non plus, car je parle pas Python non plus, pour l'instant, hahaha

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Par défaut
    Bonjour,

    La méthode extend manipule le contenu de la liste/classe, mais ne retourne rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    y = list()
    y.extend([1, ])
    assert y == [1, ]
    La méthode ne retourne rien : None

    Dans votre boucle le fait d'écrire :
    y=y.extend(pROD(a,B))

    Au premier passage la liste y va être remplacée par None

    d'où l'erreur lors du second passage : AttributeError: 'NoneType' object has no attribute 'extend'

  4. #4
    Membre averti
    Homme Profil pro
    master2 math
    Inscrit en
    Mars 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : master2 math

    Informations forums :
    Inscription : Mars 2016
    Messages : 19
    Par défaut
    Citation Envoyé par YCL-1 Voir le message
    Bonjour,

    La méthode extend manipule le contenu de la liste/classe, mais ne retourne rien.
    Merci beaucoup pour cette réponse, elle confirme ce que je pensais, du coup j'ai fabriqué des fonctions qui retournent des choses, car j'ai le même problème avec remove et append (pour extend il y a le +, peut-être que remove et append ont aussi un homologue "retourneur"...mais j'ai cru ne pas en rencontrer dans les tutos...)
    ça me rassure que ce soit à cause de ça que ça coinçait, je n'étais pas trop sûr, et je commençai presque à être moins enthousiaste, merci encore!

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par MatheuxNoviceEnProg Voir le message
    Merci beaucoup pour cette réponse, elle confirme ce que je pensais, du coup j'ai fabriqué des fonctions qui retournent des choses, car j'ai le même problème avec remove et append (pour extend il y a le +, peut-être que remove et append ont aussi un homologue "retourneur"...mais j'ai cru ne pas en rencontrer dans les tutos...)
    C'est la différence entre objets immutables (int, str) et mutables (list,...).
    Si vous essayez de modifier un objet immutable, il n'y a pas d'autre choix que de retourner le nouvel objet crée à partir de...
    Soit:
    une méthode appliquée à "s" retourne le nouvel objet:
    sans avoir changé le "s" de départ:
    Lorsqu'on utilise un objet mutable, çà retournera "None" (vous avez toujours accès à l'objet que vous modifiez).

    Retourner l'objet permet le chainage des appels de méthodes: s.upper().startswith('A')...
    Ce qui peut paraître intéressant mais qui devient vite un casse tête à debugger lorsque les objets sont mutables.

    note: c'est cet aspect mutable ou pas qui fait aussi que seuls les types de bases non mutables sont hashables.

    Et vous ne trouverez pas de tuto. la dessus car il s'agit de différentes approches de la programmation orientée objet (qui n'est pas spécifique à Python) dont le nombre rivalise avec le nombre de fromages que nous avons en France.

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

  6. #6
    Membre averti
    Homme Profil pro
    master2 math
    Inscrit en
    Mars 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : master2 math

    Informations forums :
    Inscription : Mars 2016
    Messages : 19
    Par défaut
    merci pour cette réponse qui du coup me fait m'interroger, car tout est nouveau, donc pas très clair... et on peut facilement croire qu'on a "un peu compris" mais en fait ne pas avoir compris l'essence du problème, je crois que c'est plutôt le deuxième point, en ce qui me concerne^^
    Citation Envoyé par wiztricks Voir le message



    C'est la différence entre objets immutables (int, str) et mutables (list,...).




    - W
    Donc, si j'ai bien compris, ce sont les methodes qui caractérisent la mutabilité ou non d'un objet... du coup me vient une question

    Est-ce qu'un objet peut être retourné par une méthode et pas retourné par une autre?
    Si c'est le cas, il serait à la fois mutable et immutable... si la réponse est non, je commence à comprendre la specificité sémantique des methodes, par rapport aux fonctions, parce que jusqu'à maintenant je me disais qu' une méthode est une fonction écrite différemment : si j'ai bien compris (façon de parler^^) la spécificité de methode par rapport à fonction, c'est en rapport avec la mutabilité...??

    J'ai conscience qu'il y a beaucoup de questions dans ce que je retranscris de mon interrogation intérieure, mais comme tout n'est pas clair pour moi, j'ai du mal à cibler des questions précises...

    D'autant que le fait que la mutabilité soit aussi caractérisée par la hashabilité, me donne à penser que le concept de hashable et celui de methodes sont liées, cependant je n'ai pas bien compris ce qu'est hashable, mais si c'est lié à la question de mutable et (donc?) de methode, c'est peut-être le moment d'essayer de comprendre...ou alors peut-être que je devrais plutôt continuer à "m'amuser" sans trop essayer de comprendre, et revoir ces questions de fond plus tard quand j'aurais un tout petit peu de pratique...

    Merci beaucoup à nouveau!

Discussions similaires

  1. Réponses: 15
    Dernier message: 19/07/2011, 08h56
  2. [eCommerce] Quel moyen de micro paiement choisir pour mon site ?
    Par bugrider44 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 10/02/2011, 15h53
  3. [in] attribute error aprés migration vs2005
    Par lemarin dans le forum C++
    Réponses: 19
    Dernier message: 27/08/2008, 16h03
  4. Réponses: 7
    Dernier message: 17/12/2006, 01h22

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