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 :

POO: fonction de retour, liste et AttributeError


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2016
    Messages : 13
    Par défaut POO: fonction de retour, liste et AttributeError
    Bonjour à tous,

    Je poursuis mon apprentissage de la programmation en python. J'ai abordé la POO. Je suis en train d'écrire un programme dont le but est d'ouvrir et analyser un fichier fasta avec diverses méthodes.

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    import os, sys
     
    pyScriptName = sys.argv[0]
    RNASequence = sys.argv[1]
    #outputProtein = sys.argv[2]                                                                                                             
     
    # Dictionnaire codon                                                                                                                        
     
    Codon = {
        "AUG": "Methionine",
        "UUU": "Phenylalanine",
        "UUC": "Phynylalanine",
        "UUA": "Leucine",
        "UUG": "Leucine",
        "UCU": "Serine",
        "UCC": "Serine",
        "UCA": "Serine",
        "UCG": "Serine",
        "UAU": "Tyrosine",
        "UAC": "Tyrosine",
        "UGU": "Cysteine",
        "UGC": "Cysteine",
        "UGG": "Tryptophan",
        "UAA": "STOP",
        "UAG": "STOP",
        "UGA": "STOP"
    }
     
    fasta_dict = {}
     
    class Fasta():
        """Classe pour manipuler des fichiers fasta."""
        def __init__(self, RNASequence):
            self.RNASequence = RNASequence
     
        def openFasta(self):
    	"""ouvre un fichier fasta, stocke l'id et la séquence dans un dictionnaire."""
            with open(RNASequence, "r") as fasta_file:
                sequence_id = ""
                for line in fasta_file:
                    if line.startswith(">"):
                        sequence_id = line.strip()
                        fasta_dict[sequence_id] = ""
                    else:
                        fasta_dict[sequence_id] += line.strip()
                return(fasta_dict)
     
        def sequence(self):
    	"""Récuperer la sequence"""
    	seq_list = []
    	for seque in fasta_dict:
                seq_list.append(fasta_dict[seque])
    	return(seq_list)
     
        def RNAtoProteins(self):
    	"""Traduire la sequence ARN en protéine."""
            for sequen in seq_list:
                print(sequen)
                protein = []
                for i in range(0, len(sequen), 3):
                    aa = Codon[sequen[i:i+3]]
                    protein.append(aa)
                    if aa == "STOP":
                        break
                return(protein)
     
    if __name__ == "__main__":
        test_file = Fasta(RNASequence)
        my_file = test_file.openFasta()
        print("Voici le resultat")
        print(my_file)
        result2 = test_file.sequence()
        print("Resultat de .sequence")
        print(result2)
        proteinefromRNA = result2.RNAtoProteins()
        print(proteinefromRNA)
    Lorsque, j'exécute le code avec les séquences dans un fichier fasta (voir ci-dessous), j'obtiens le message d'erreur suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AttributeError: 'list' object has no attribute 'RNAtoProteins'
    Si j'ai bien compris, cette erreur me dit que l'assignation de l'attribut ne fonctionne pas. Que faire pour corriger cela ?

    Merci pour votre aide.

    A bientôt !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    >Sequence 1
    AUGUUUUCUUAAAUG
     
    >Sequence 2
    AUGUUUUCUAAAAUGCUUAUAGCAGCUAAU
     
    >Sequence 3
    AUGUUUUCUUAAAUUAUGCCCGUAA

  2. #2
    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 : 74
    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


    Après plusieurs corrections , j'arrive à quelque chose qui tournera peut être !

    Je ne sais pas tester puisque je n'ai pas le fichier fa.

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    class Fasta():
        """Classe pour manipuler des fichiers fasta."""
     
        def __init__(self, RNASequence):
            self.RNASequence = RNASequence
     
        def openFasta(self):
            """ouvre un fichier fasta, stocke l'id et la séquence dans un dictionnaire."""
            with open(self.RNASequence, "r") as fasta_file:
                sequence_id = ""
                for line in fasta_file:
                    if line.startswith(">"):
                        sequence_id = line.strip()
                        fasta_dict[sequence_id] = ""
                    else:
                        fasta_dict[sequence_id] += line.strip()
     
        def sequence(self):
            """Récuperer la sequence"""
            seq_list = []
            for seque in fasta_dict:
                seq_list.append(fasta_dict[seque])
            return seq_list
     
        def RNAtoProteins(self, seq_list):
            """Traduire la sequence ARN en protéine."""
            protein = []
            for sequen in seq_list:
                for i in range(0, len(sequen), 3):
                    aa = Codon.get(sequen[i:i+3], '')
                    protein.append(aa)
                    if aa == "STOP":
                        break
            return protein
     
     
    if __name__ == "__main__":
        f = Fasta(RNASequence)
        f.openFasta()
        print(fasta_dict)
        seqs = f.sequence()
        print(seqs)
        proteinefromRNA = f.RNAtoProteins(seqs)
        print(proteinefromRNA)

    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.)

  3. #3
    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
    Bonjour
    Citation Envoyé par benoit3166 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        def sequence(self):
    	"""Récuperer la sequence"""
    	seq_list = []
    	for seque in fasta_dict:
                seq_list.append(fasta_dict[seque])
    	return(seq_list)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def sequence(self):
    	"""Récuperer la sequence"""
    	return fasta_dict.values()				# Eventuellement yield from fasta_dict.values()
    Ca ne résoudra pas ton problème puisque tu ne donnes ni la ligne où il se produit, ni un jeu d'essai pour pouvoir le reproduire ; mais ça simplifiera au-moins ton code. Et en plus, comme une "values()" d'un dictionnaire reste associée au dictionnaire, si le dico évolue après coup, la vue évolue avec (ce que ne fait pas une liste figée)
    PS: je ne pige pas pourquoi "fasta_dict" est une globale alors qu'elle pourrait être intégrée dans l'objet "fasta".
    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]

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

    Citation Envoyé par benoit3166 Voir le message
    Si j'ai bien compris, cette erreur me dit que l'assignation de l'attribut ne fonctionne pas. Que faire pour corriger cela ?
    result2 est la liste retournée par la méthode .sequence.
    Une liste n'est pas un Fasta et n'a aucune raison d'avoir RNAtoProteins comme attribut.

    Un objet (créer ou non avec "class"), c'est définir un état (sous la forme d'attributs) et des méthodes (qui modifient éventuellement l'état).
    note: dans le code, "l'état" va être reflété par des variables d'instances sous la forme self.variable.

    Il n'est pas interdit de fabriquer une classe qui soit juste une collection de fonctions (dans une boîte on met un peu ce qu'on veut), mais çà reste des fonctions: une opération qui récupérè des objets en entrée et en produit d'autres (ou les transforme) en sortie....

    Entre d'un côté des fonctions sans état et de l'autre des "class" qui permettent d'avoir un état, on est entre deux modèles assez différents qu'on évite de mélanger.

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

  5. #5
    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 : 74
    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
    Citation Envoyé par Sve@r Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def sequence(self):
    	"""Récuperer la sequence"""
    	return fasta_dict.values()
    Pour obtenir le même résultat que le code original, une list, il faut écrire :

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def sequence(self):
            """Récuperer la sequence"""
            return list(fasta_dict.values())

    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.)

  6. #6
    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 danielhagnoul Voir le message
    Pour obtenir le même résultat que le code original, une list, il faut écrire :

    Code Python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        def sequence(self):
            """Récuperer la sequence"""
            return list(fasta_dict.values())
    Ouaip. Comme je l'ai dit, le souci c'est que tu obtiens un truc indexable ok, mais un truc figé. Si le dico évolue après, ben tant pis.
    Perso je préfère obtenir une vue. Et si je dois l'indexer alors j'indexe ma vue "à la volée". Exemple tab=Fasta(truc).sequence(); print(tuple(tab)[0]). Toutefois je n'ai jamais eu l'utilité d'indexer les keys/values/items d'un dico (itérer dessus oui, mais taper via un index...?)

    Mais je suis d'accord avec toi, ma version ne reproduit plus le code d'origine avec exactitude
    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]

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2016
    Messages : 13
    Par défaut
    Bonjour à tous,

    Merci pour vos réponses fort intéressantes.

    J'aurai du préciser le but de mon programme. Il s'agit d'un programme qui lit un fichier fasta, récupère la ou les différente(s) séquence(s) d'ARN et à partir de celle(s)-ci, donne la séquence protéique. A terme, mon but est de faire un petit GUI avec Tkinter, lorsque j'aurai abordé cette partie. Pour l'instant, je souhaite maîtriser la POO et visiblement, il faut que je revois les notions.

    Ca ne résoudra pas ton problème puisque tu ne donnes ni la ligne où il se produit, ni un jeu d'essai pour pouvoir le reproduire
    @Sve@r, j'ai bien donné un jeu d'essai dans mon premier post (tout en bas du post et j'aurai du être plus explicite). De plus, je pensais que le lien (dans la première ligne) vers fichier fasta serait suffisant. Je me suis trompé.

    Je remet ci-dessous l'exemple de fichier test. Il suffit de le copier-coller dans un éditeur et d'enregistrer le fichier avec l'extension .fasta.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    >Sequence 1
    AUGUUUUCUUAAAUG
     
    >Sequence 2
    AUGUUUUCUAAAAUGCUUAUAGCAGCUAAU
     
    >Sequence 3
    AUGUUUUCUUAAAUUAUGCCCGUAA
    Quant au message d'erreur, il se produit à la ligne 76 de mon code.

    En relisant le message de Daniel et Sve@r, à propos de la liste et du dictionnaire. Je pense que c'est effectivement une mauvaise idée d'utiliser une liste. Je perds l'information du nom des séquences protéique, qui ne change pas. Il faudrait donc à partir de fasta_dict, créer un nouveau dictionnaire qui garderai le nom des séquences comme clé et contiendrais comme valeur la séquence protéique transcrite à partir de la séquence d'ARN. Je vais réfléchir à comment faire ça.

    D'après le message de wiztricks, j'ai compris qu'il serait plus simple de faire juste des fonctions, plutôt qu'une classe avec plein de méthodes, qui sont en fait que des fonctions. C'est bien ça ?

    C'est fort instructif et il me reste encore beaucoup de travail pour maîtriser toutes ces notions et les appliquer. Plus je code, plus j'apprécie de coder.

  8. #8
    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 benoit3166 Voir le message
    Pour l'instant, je souhaite maîtriser la POO et visiblement, il faut que je revois les notions.
    Bah, c'est pas mal comme début. Des maladresses oui mais rien de vraiment mauvais.

    Citation Envoyé par benoit3166 Voir le message
    @Sve@r, j'ai bien donné un jeu d'essai dans mon premier post (tout en bas du post et j'aurai du être plus explicite). De plus, je pensais que le lien (dans la première ligne) vers fichier fasta serait suffisant. Je me suis trompé.
    Ben c'est plus facile d'avoir un jeu d'essai que d'aller chercher dans wikipedia le détail du format, l'étudier et ensuite se construire péniblement son propre jeu d'essai pour tenter de reproduire ton problème. Mais j'avais pas compris que ton exemple en bas du premier post était un vrai fichier. Je pensais que c'était une sortie écran.

    Citation Envoyé par benoit3166 Voir le message
    En relisant le message de Daniel et Sve@r, à propos de la liste et du dictionnaire. Je pense que c'est effectivement une mauvaise idée d'utiliser une liste. Je perds l'information du nom des séquences protéique, qui ne change pas. Il faudrait donc à partir de fasta_dict, créer un nouveau dictionnaire qui garderai le nom des séquences comme clé et contiendrais comme valeur la séquence protéique transcrite à partir de la séquence d'ARN. Je vais réfléchir à comment faire ça.
    Donc si dico1 est un dictionnaire qui a des clefs et des valeurs, et que dico2 doit être un dictionnaire qui a les mêmes clefs et d'autres valeurs calculées à partir de celles du premier, t'as grosso-modo 2 solutions
    S1: tu crées dico2 à partir de dico1
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (k, v) in dico1.items():
    	dico2[k]=expression utilisant v
    Qu'on peut écrire avec une liste en intension: dico2=dict((k, expression_utilisant v) for (k, v) in dico1.items()).

    S2: Tu crées un seul dico contenant des sous-dico comme valeur
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    dico={
    	"seq1" : {
    		"data" : la_data_de_base 1,
    		"res" : None,
    	},
    	"seq2" : {
    		"data" : la_data_de_base 2,
    		"res" : None,
    	},
    	"seq3" : {
    		"data" : la_data_de_base 3,
    		"res" : None,
    	},
    	...
    }

    Ensuite t'as plus qu'à balayer le dico et calculer chaque "res" en fonction de sa "data"
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for v in dico.items():
    	v["res"]=expression_utilisant v["data"]

    Citation Envoyé par benoit3166 Voir le message
    D'après le message de wiztricks, j'ai compris qu'il serait plus simple de faire juste des fonctions, plutôt qu'une classe avec plein de méthodes, qui sont en fait que des fonctions. C'est bien ça ?
    C'est vrai qu'une classe sans attribut ne se justifie pas vraiment (on enlève la classe, on garde juste les méthodes qui deviennent de simples fonctions) mais je pense que ta classe pourrait plus tard, si ton code évolue et s'enrichit de certains détails, avoir alors des attributs qui donc justifieront son existence. Peut-être que le dico de tes séquences génétiques pourra devenir attribut au lieu de le laisser en globale
    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]

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

    Citation Envoyé par benoit3166 Voir le message
    D'après le message de wiztricks, j'ai compris qu'il serait plus simple de faire juste des fonctions, plutôt qu'une classe avec plein de méthodes, qui sont en fait que des fonctions. C'est bien ça ?
    Vous constatez que vous effectuez une suite de transformations: fichier -> dictionnaire -> liste -> ...
    Qu'est ce qui "persiste"/doit être transmis d'une transformation à l'autre?
    Répondre à cette question pourrait aider à définir des "attributs" i.e. des objets qu'il serait souhaitable/utile de voir perdurer au delà de la durée de vie d'une simple fonction.

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

Discussions similaires

  1. Liste d'appel à des fonctions avec retour boolean
    Par conan76 dans le forum VB.NET
    Réponses: 4
    Dernier message: 30/10/2016, 11h53
  2. Retour de fonction contenant une "liste" - Conventions ?
    Par Jimalexp dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 26/01/2009, 14h08
  3. Comment rappeler une fonction dans une liste déroulante
    Par strogos dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/05/2005, 23h54
  4. [POO] fonction toUpperCase : Objet attendu
    Par LineLe dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/04/2005, 16h51
  5. Equivalent de la fonction d'agregat LIST ?
    Par rahan15 dans le forum SQL
    Réponses: 5
    Dernier message: 10/12/2004, 22h21

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