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 :

Le namedtuple, peut-être un peu inutilement compliqué


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut Le namedtuple, peut-être un peu inutilement compliqué
    Bonjour

    Je m'interrogeais sur l'utilité du premier argument d'un namedtuple. Ex point=namedtuple("Point", ("x", "y")) puis p=Point(2, 3). Peut-être un peu inutilement compliqué non ?
    Je veux dire que si je dois créer un tuple j'écris naturellement p=(2, 3). Je me serais attendu pour un namedtuple à faire un truc équivalent style p=namedtuple(((x, 2), (y, 3))) un peu à la manière d'un OrderedDict (qui finalement a quelques ressemblances). Alors ok on peut écrire p=namedtuple("Point", ("x", "y"))(2, 3) mais c'est ce premier paramètre "Point" qui me chagrine. Même l'OrderedDict n'a pas cette complication lui.
    Donc à quoi sert concrètement ce nom qu'on passe en premier paramètre ? Quelqu'un l'a-t-il déjà utilisé ?

    Merci à tous.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

    Citation Envoyé par Sve@r Voir le message
    Donc à quoi sert concrètement ce nom qu'on passe en premier paramètre ? Quelqu'un l'a-t-il déjà utilisé ?
    Le tuple est une séquence d'objets que l'on peut accéder par un index.
    Le "namedtuple" permet d'y avoir aussi un accès via un nom.
    Et le paramètre sert juste à passer les noms/labels correspondant aux différents indices. (et faire que le tuple soit named).

    Le premier paramètre "Point" est un détail de l'implémentation qui créé une classe avec ce nom là. Ils auraient pu choisir class Point(namedtuple(labels))... mais à coder c'est plus sportif.

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

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 063
    Par défaut
    Bonjour,

    Citation Envoyé par Sve@r Voir le message
    Donc à quoi sert concrètement ce nom qu'on passe en premier paramètre ? Quelqu'un l'a-t-il déjà utilisé ?
    Oui dans ses début quand il est apparu pour tester.

    Ça m'a permis d'éviter de créer des classes sans méthode, mais il est vrai que je l'utilise très peu, ça me paraît pas indispensable comme objet.

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    (et faire que le tuple soit named).
    Je m'en rends compte. Je pensais que c'étaient ses items qui étaient named mais en fait pas seulement quoi.

    Citation Envoyé par wiztricks Voir le message
    Le premier paramètre "Point" est un détail de l'implémentation qui créé une classe avec ce nom là.
    Oui c'est ça. On a bien un objet au final.

    Citation Envoyé par fred1599 Voir le message
    Ça m'a permis d'éviter de créer des classes sans méthode, mais il est vrai que je l'utilise très peu, ça me paraît pas indispensable comme objet.
    Ca m'intéresse un peu car j'utilise pas mal la notion "d'environnement" (que je regroupe donc dans un objet dédié) et comme généralement l'environnement d'un projet c'est un truc assez invariant, je me disais que le namedtuple serait peut-être approprié pour ça.
    Mais bon, quand je vois comment l'implémenter je me dis que ça ne ressemble pas vraiment à "simple is better than complex"...

    Seulement (nouveau détail) ce truc qui, comme M. Jourdain, est un objet sans le savoir, possède donc des méthodes dédiées (style "index()" ou "count()"). C'est normal puisque ça se veut aussi tuple ça doit offrir les mêmes options. Mais bon, on ne peut pas changer la méthode "count()" d'un tuple tandis que celui, qui (oubliant ce détail) écrit truc=namedtuple("truc", ("count", "index"))...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 063
    Par défaut
    Ca m'intéresse un peu car j'utilise pas mal la notion "d'environnement" (que je regroupe donc dans un objet dédié) et comme généralement l'environnement d'un projet c'est un truc assez invariant, je me disais que le namedtuple serait peut-être approprié pour ça.
    Ça l'est peut-être, je ne doute pas de tes choix conceptuels, par contre, au vue de sa création, je dirais que c'est pas optimal pour un code efficace.

    C'est construit par un exec string, c'est pas optimum et n'a rien à voir avec le tuple standard sur la partie performance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec class_definition in namespace
    birk ! Merci de m'avoir fait redécouvrir les namedtuples, je me suis intéressé au code source grâce à toi

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    C'est même rigolo comme interrogation : "hey les gars ! pourquoi je dois donné un nom à mon tuple nommé ?"

    Effectivement, ça te permet de nommer les champs mais aussi le type lui même. C'est vrai que c'est un peu dommage de devoir écrire TRUC = namedtuple("TRUC", "....") mais soit.

    Personnellement, je trouve ça bien pratique, je m'en sers pour l'équivalent d'une bête structure C (avec un __str__ déjà tout fait). Quand je sens le besoin de rajouter des méthodes, je passe à une "classe normale" et mon code reste compatible.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Bktero Voir le message
    C'est même rigolo comme interrogation : "hey les gars ! pourquoi je dois donné un nom à mon tuple nommé ?"
    Ben oui. Je comprenais "namedtuple" comme "named item's tuple".

    Citation Envoyé par Bktero Voir le message
    mais soit.
    Mouais. Enfin quand j'écris a=dict(...) mon dict il s'appelle "a". Mon dict il est nommé "virtuellement". Là obligé d'écrire xxx=namedtuple("a", ...) puis a=xxx(...). Ou alors a=namedtuple("a", ...)(...) mais bon, c'est pas des plus "simple is better" quoi.. Mais ok, soitons zensembles.

    Citation Envoyé par Bktero Voir le message
    Personnellement, je trouve ça bien pratique, je m'en sers pour l'équivalent d'une bête structure C (avec un __str__ déjà tout fait).
    Et tu n'utilises pas les possibilités du tuple (l'indexation, le slicing, l'itérativité) ?

    Citation Envoyé par Bktero Voir le message
    Quand je sens le besoin de rajouter des méthodes, je passe à une "classe normale" et mon code reste compatible.
    Ah oui je vois pourquoi. Ou alors tu rajoutes __getitem__() et __iter__()
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut


    @Pyramidev avait raison, après quelques tests de manipulation de l'un et de l'autre, j'ai un nette préférence pour les dataclasses : https://docs.python.org/3/library/dataclasses.html

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pyramidev Voir le message
    À partir de Python 3.7, on a les data classes
    J'ai moi aussi fait quelques essais et c'est carrément ce qu'il me fallait ! Jusqu'à maintenant j'utilisais des namedtuples, je vais maintenant utiliser des dataclasses pour ce cas particulier ! Merci !

Discussions similaires

  1. j'en demande peut être un peu trop aux expregs
    Par professeur shadoko dans le forum Langage
    Réponses: 1
    Dernier message: 01/03/2017, 21h13
  2. Question peut être inutile
    Par harmonips dans le forum Images
    Réponses: 0
    Dernier message: 24/04/2012, 05h49
  3. Requête peut être simple, mais compliquée pour moi !
    Par xfree dans le forum Langage SQL
    Réponses: 11
    Dernier message: 17/08/2007, 16h09
  4. Réponses: 2
    Dernier message: 10/03/2004, 18h52
  5. question (peut-être idiote) sur les vues
    Par LadyArwen dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/03/2003, 10h35

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