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 :

Retrouver une donnée...dans une structure un peu complexe...


Sujet :

Python

  1. #1
    Membre actif Avatar de CoyotteDundee
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut Retrouver une donnée...dans une structure un peu complexe...
    Bonjour à toutes et tous,
    Fraîchement débarqué en Python, j'essaie d'accéder à une information sans trouver la bonne syntaxe.

    Que je vous explique : J'ai une API (Jenkins pour ne pas la nommer) que j'utilise pour retrouver des infos sur le serveur concerné.
    Je tente de récupérer des infos du compte connecté via l'appel get_whoami().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    user = server.get_whoami()
     
    print (user.keys())
    prop = user['property']
    print(prop)
    Ci-dessous le résultat affiché :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    dict_keys(['_class', 'absoluteUrl', 'description', 'fullName', 'id', 'property'])
     
    [{'_class': 'jenkins.security.ApiTokenProperty'}, {'_class': 'com.cloudbees.plugins.credentials.UserCredentialsProvider$UserCredentialsProperty'}, {'_class': 'hudson.model.MyViewsProperty'}, {'_class': 'org.jenkinsci.plugins.displayurlapi.user.PreferredProviderUserProperty'}, {'_class': 'hudson.model.PaneStatusProperties'}, {'_class': 'hudson.search.UserSearchProperty', 'insensitiveSearch': True}, {'_class': 'jenkins.security.LastGrantedAuthoritiesProperty'}, {'_class': 'hudson.tasks.Mailer$UserProperty', 'address': 'Mxxxxx.Bxxxx@xxxxxx.be'}, {'_class': 'jenkins.security.seed.UserSeedProperty'}, {'_class': 'hudson.plugins.emailext.watching.EmailExtWatchAction$UserProperty', 'triggers': []}]
    Ma question : Comment puis-je accéder à l'information "address" pour récupérer la valeur 'Mxxxxx.Bxxxx@xxxxxx.be' à partir de la variable 'prop' ?
    Le contenu de prop serait-il une liste de dictionnaires ?
    La répons est certainement triviale, sauf peut-être pour un débutant :-)

    En vous remerciant d'avance pour votre aide,

    Coyotte

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

    Citation Envoyé par CoyotteDundee Voir le message
    Le contenu de prop serait-il une liste de dictionnaires ?
    Voilà! Donc on fait une boucle pour trouver le dictionnaire qui a la clef recherchée et on en récupère la valeur voulue.

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

  3. #3
    Membre actif Avatar de CoyotteDundee
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut
    Oki, Merci pour l'information.
    J'espérais quelque chose de plus direct (Au niveau Python, pas au niveau de la réponse ) mais pas de souci, je vais me coder un ch'tite fonction pour ce faire.

    Coyotte

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

    Citation Envoyé par CoyotteDundee Voir le message
    J'espérais quelque chose de plus direct (Au niveau Python, pas au niveau de la réponse
    Ici, c'est un forum de discussion, on ne livre pas de code (ni de pizza).
    Par contre, si vous essayez quelque chose et que çà ne marche pas, vous pourrez montrer ce que vous avez fait et demander de l'aide.

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

  5. #5
    Membre actif Avatar de CoyotteDundee
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut
    C'est bien ce que je disais: Je n'attendais pas quelque chose de plus direct au niveau de la réponse.

    Mais je suis surpris que Python ne dispose pas d'un ou plusieurs outils pour ce type de données et qu'il faille écrire du code pour ce faire car ce genre de structure semble assez courant en Python.

    Mais ce n'est pas grave... Je vais directement commencer à coder ma boite à outils.
    Merci pour l'info,

    Coyotte

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

    Citation Envoyé par CoyotteDundee Voir le message
    Mais je suis surpris que Python ne dispose pas d'un ou plusieurs outils pour ce type de données et qu'il faille écrire du code pour ce faire car ce genre de structure semble assez courant en Python.
    Filtrer une liste de dictionnaires se fera toujours avec une boucle qui va tester les différents dictionnaires.
    Après, s'il y a plein de façons pour faire des boucles avec Python, mais celle que vous connaissez marchera très bien.

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

  7. #7
    Invité
    Invité(e)
    Par défaut
    Salut !

    Moi par contre je donne des soluces ! Pi après Wiz il vient me corriger !

    En voici deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> def test():
    	address = str(prop).split("address': '")[1].split("'")[0]
    	print(address)
     
    	address = "".join(dico['address'] for dico in prop if 'address' in dico.keys())
    	print(address)
     
    >>> test()
    Mxxxxx.Bxxxx@xxxxxx.be
    Mxxxxx.Bxxxx@xxxxxx.be
    Les deux ne donneront pas forcément le même résultat en fonction du contexte... S'il y a plusieurs clés 'address' la deuxième solution va renvoyer toutes les adresses !
    Après je ne peux pas te dire quelle solution est la plus performante ou la plus "pythonique" ou la plus élégante...

    A+

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 748
    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 748
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Moi par contre je donne des soluces ! Pi après Wiz il vient me corriger !
    Si pour ne pas écrire une boucle simple, vous partez à écrire n'importe quoi... et que çà vous plaît, c'est votre problème. (et les tutos sont là pour apprendre les constructions de base).

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

  9. #9
    Membre actif Avatar de CoyotteDundee
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut
    Merci LeNarvalo.
    J'ai maintenant deux pistes à explorer.

    Bonne journée,

    Coyotte

  10. #10
    Membre actif Avatar de CoyotteDundee
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut
    Voilà.

    Le code fonctionne.
    J'ai écrit 3 versions pour voir un peu comment il était possible de retrouver l'info.

    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
     
    def find_dict_in_dictList(list, dict_key, dict_value):
        result = []
        for dico in list:
            if  (dict_key in dico)  and (dico[dict_key] == dict_value):
                result.append(dico)
        return result
     
    def find_dict_in_dictList2(list, dict_key, dict_value):
        i = 0
        while i < len(list):
            if (dict_key in list[i]) and (list[i][dict_key] == dict_value):
                return dict(list[i])
            else:
                i = i+1
     
    def find_dict_in_dictList3(list, dict_key, dict_value):
        result = []
        for dico in list:
            if  (dict_key in dico)  and (dico[dict_key] == dict_value):
                return dico
     
    if __name__ == '__main__':
        aList= [{'_class': 'jenkins.security.ApiTokenProperty'}, {'_class': 'com.cloudbees.plugins.credentials.UserCredentialsProvider$UserCredentialsProperty'},{'_class': 'jenkins.security.LastGrantedAuthoritiesProperty'}, {'_class': 'hudson.tasks.Mailer$UserProperty', 'address': 'Mxxxxx.Bxxxx@xxxxxx.be'}, {'_class': 'hudson.plugins.emailext.watching.EmailExtWatchAction$UserProperty', 'triggers': []}]
     
        dic1 = find_dict_in_dictList( aList, '_class', 'hudson.tasks.Mailer$UserProperty')
        print( dic1 )
        print (dic1[0]['address'])
     
        dic2 = find_dict_in_dictList2(aList, '_class', 'hudson.tasks.Mailer$UserProperty')
        print (type(dic2))
        print (dic2['address'])
     
        dic3 = find_dict_in_dictList3(aList, '_class', 'hudson.tasks.Mailer$UserProperty')
        print (type(dic3))
        print (dic3['address'])
    La version 3 me semble la plus simple et la plus directe mais répond-t-elle aux canons de Python ?
    En tous cas, cela fonctionne.

    Merci pour votre aide à tous,

    Coyotte

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

    Citation Envoyé par CoyotteDundee Voir le message
    La version 3 me semble la plus simple et la plus directe mais répond-t-elle aux canons de Python ?
    J'écrirais plutôt:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def find_dict_in_list(alist, k, v):
        for d in alist:
            if v == d.get(k):
                return d
    et si on devait retourner une liste, ce serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find_dict_in_list = lambda alist, k, v: [ d for d in alist if v == d.get(k) ]
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre actif Avatar de CoyotteDundee
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut
    Clair, précis, concis...
    C'est beau !

    Merci wiztricks,

    Coyotte

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

    Citation Envoyé par CoyotteDundee Voir le message
    Clair, précis, concis...
    C'est beau !
    C'est juste une boucle qui parcourt la liste de dictionnaires et qui filtre...

    La différence avec votre code est dans le test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (dict_key in dico)  and (dico[dict_key] == dict_value):
    remplacé par:
    qui suppose v différent de None (pour donner le même résultat).

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

  14. #14
    Membre actif Avatar de CoyotteDundee
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut
    Bonjour,

    qui suppose v différent de None (pour donner le même résultat).
    Dans ce cas, bkindez-vous le code avec quelques assertions en début de fonction du genre de

    Coyotte

  15. #15
    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 CoyotteDundee Voir le message
    Dans ce cas, bkindez-vous le code avec quelques assertions en début de fonction du genre de assert v is not none ?
    Non, jamais. Et ce pour plusieurs raisons
    • si le assert échoue cela provoque une exception. Typiquement le programme entier plante. Ce qui peut ne pas plaire à l'utilisateur qui préfèrerait qu'on lui dise qu'il y a un souci et s'il peut y remédier (je parle là d'un programme que tu développes pour qu'il soit utilisé par un tiers)
    • si tu maitrises ton code tu sais en permanence ce que contient ta variable. Et si la valeur provient de l'extérieur, alors tu as le droit de la vérifier avant traitement pour justement, si cette valeur n'est pas correcte, prévenir l'utilisateur afin qu'il la corrige si possible. Ou dans le pire des cas, terminer alors proprement ton application sans la faire planter
      Nom : index.jpeg
Affichages : 150
Taille : 11,0 Ko
    • assert n'est pas traité lorsque Python exécute le code de façon optimisée

    Ca peut être utile dans des tests unitaires. Par exemple tu peux mettre un assert dans la partie de code dédié à tester la fonction, mais pas dans la partie de code critique de ton programme.
    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]

  16. #16
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    1 603
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 1 603
    Par défaut
    Citation Envoyé par CoyotteDundee Voir le message
    Bonjour,



    Dans ce cas, bkindez-vous le code avec quelques assertions en début de fonction du genre de

    Coyotte
    Comme dit Sve@r, si le assert échoue le programme va planter en levant l'exception AssertionError.

    Certes, on pourrait faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    toto = 1
    try:
        assert toto is None
    except AssertionError:
        print('heu non, pas None')
    mais c'est plus simple de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto = 1
    if toto is not None:
        print('heu non, pas None')

  17. #17
    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 Arioch Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    toto = 1
    try:
        assert toto is not None
    except AssertionError:
        print('heu non, pas None')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto = 1
    if toto is None:
        print('heu non, pas None')
    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]

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

    Citation Envoyé par CoyotteDundee Voir le message
    Dans ce cas, bkindez-vous le code avec quelques assertions en début de fonction du genre de
    Je ne faisais que constater les différences.
    Après, ce code est associé à un traitement de données particulières où la valeur associée à '_class' n'a aucune raison d'être None.

    Un assert pourrait assurer que l'hypothèse n'est pas farfelue.

    Mais si on utilise cela pour autre chose (d'autres données), il faudra être plus violent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if v is None:
         raise ValueError('v not expected to be None')
    ou forcer le test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            if k in d and v == d.get(k):
                return d

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

  19. #19
    Membre actif Avatar de CoyotteDundee
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2008
    Messages : 54
    Par défaut
    Merci pour vos réponses.

    si le assert échoue cela provoque une exception. Typiquement le programme entier plante. Ce qui peut ne pas plaire à l'utilisateur qui préfèrerait qu'on lui dise qu'il y a un souci et s'il peut y remédier (je parle là d'un programme que tu développes pour qu'il soit utilisé par un tiers)
    J'entends bien.
    Mais si l'appel est sensé passer une variable assignée et que ce n'est pas le cas, je ne vois pas bien comment l'utilisateur de l'application va pouvoir y remédier.

    C'est ce qui distingue pour moi les tests "fonctionnels" des tests "techniques"
    Si un test fonctionnel dit "Le client doit être majeur", il ne me viendrait pas à l'idée de faire ce test avec une assertion car c'est une information pour l'utilisateur et le programme doit gérer ce cas.
    Par contre, si un paramètre d'une fonction doit être assigné ou d'un type particulier, c'est une information pour le développeur. A priori, l'utilisateur ne peut pas résoudre le problème.

    Mais bon... Ce sont probablement de vieux réflexes de "vieux" développeur Delphi...
    C'est pour cela que vos avis sont intéressants dans le cadre de l'apprentissage d'un nouveau langage.

    Merci à vous,

    Coyotte

  20. #20
    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 CoyotteDundee Voir le message
    Mais si l'appel est sensé passer une variable assignée et que ce n'est pas le cas, je ne vois pas bien comment l'utilisateur de l'application va pouvoir y remédier.
    C'était juste un exemple. Si l'utilisateur ne peut pas y remédier alors tu lui dis poliment "désolé l'application n'a pas pu lire la bonne valeur et va devoir quitter" au lieu d'un crash brutal style BSOD. Et tu peux faire ça sans assertion. Parce que tout contrôle que tu fais via une assertion peut aussi se faire sans comme le montre Arioch. Et n'oublie pas aussi qu'en mode optimisé, Python ne prend pas en compte les assertions.

    Citation Envoyé par CoyotteDundee Voir le message
    Par contre, si un paramètre d'une fonction doit être assigné ou d'un type particulier, c'est une information pour le développeur. A priori, l'utilisateur ne peut pas résoudre le problème.
    Oui mais si le paramètre provient de ton code alors tu n'es pas non plus censé lui passer des valeurs inadéquates. Si des données entrent du dehors, tu les contrôles au plus tôt et une fois entrées c'est bon, plus besoin tout tester en permanence. D'autant plus qu'il existe bien d'autres mécanismes tels que les valeurs par défaut (je parle pour les paramètres de fonctions).

    Citation Envoyé par CoyotteDundee Voir le message
    C'est pour cela que vos avis sont intéressants dans le cadre de l'apprentissage d'un nouveau langage.
    Ben ce nouveau langage possède un mécanisme intéressant : celui de pouvoir détecter quand un code est "exécuté" ou simplement "importé".
    Imaginons tu crées une fonction style "carré de": def carre(n): return n*n. Ensuite tu veux la tester (test unitaire). Tu ne peux pas écrire directement en dessous print(carre(5)) parce que dès que ce code sera importé (ce qui est un mécanisme permettant d'utiliser le code d'un script X dans un autre script Y) le programme qui importe affichera "25" ce qui est au minimum plutôt désagréable.
    Là tu peux alors utiliser ce mécanisme. Celui-ci se base sur la variable interne Python "__name__". C'est une variable interne dont la valeur dépend de la façon dont le script est utilisé. S'il est exécuté directement, elle vaut la string "__main__". Et s'il est importé alors elle vaut autre chose (le nom du script en fait).
    Donc là tu peux mettre ton (tes) test(s) unitaire(s). Dans lesquels l'assertion là pourra trouver sa place. Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def carre(n): return n*n
     
    if __name__ == "__main__":
    	import sys
    	assert len(sys.argv) > 1, "Il faut lancer ce script en lui donnant des nombres"		# sys.argv contient les arguments passés au programme lors de son appel
    	for arg in sys.argv[1:]:
    		print("%s: %d" % (arg, carre(int(arg)))
    # if

    Tu nommes ce script "math.py" puis pour tester ta fonction tu appelles python math.py 1 2 3 4 5 -1 -2 -3 (par exemple). Si tu ne lui passes pas d'arguments l'assertion te le dira en faisant crasher le code mais là on s'en fout, c'est juste pour tester. Et s'il y en a, l'assertion fermera sa bouche et le code continuera pour les envoyer à la fonction carre() qui sera alors testée dans toutes les configurations de ton choix.
    Et quand tu es certain que ta fonction "fonctionne", alors tu peux importer le script "math.py" dans un code plus vaste qui aura accès à la fonction carre() et qui pourra l'appeler mais en veillant bien à lui passer des paramètres adéquat avec la notion de "carré d'un nombre", paramètres que tu n'auras alors aucune raison de remettre en doute.

    Je ne dis pas que l'assertion est inutile. Je viens de filtrer tous mes codes et dans l'un d'entre eux je vois que j'en ai mis une. C'est un code interne à l'un de mes projets (donc il n'y a que moi qui l'utilise) destiné à transformer une bdd de la v1 de mon projet dans la bdd format v2. Je prends chaque info de la bdd v1 et je la mets au carat de la v2 et je décrémente une espèce de compteur d'info. Là j'ai une assertion demandant à ce que ce compteur soit toujours positif parce que si ce n'est pas le cas, ça veut dire que j'ai un sacré souci de corrélation entre la bdd v1 et v2 qu'il faut régler au plus vite. Et que mon code crashe alors sauvagement à ce moment là ne me dérange pas vraiment car si ça arrive, ce ne sera pas le crash du code le vrai souci immédiat.
    Donc oui les assertions peuvent être utiles mais je ne la mets pas à toutes les sauces quoi.
    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]

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [AC-2007] retrouver une donnée dans la 2ième colone d'une liste
    Par johanaquatique dans le forum IHM
    Réponses: 12
    Dernier message: 04/06/2010, 14h45
  2. retrouver une BD d'après (un de) ses fichiers de données
    Par Peanut dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/07/2009, 14h42
  3. comment retrouver les colonnes contenant une donnée precise
    Par monthaldo dans le forum Administration
    Réponses: 3
    Dernier message: 27/12/2007, 17h40
  4. Réponses: 3
    Dernier message: 26/02/2007, 10h14
  5. Retrouver une donnée dans une zone de liste
    Par uloaccess dans le forum Access
    Réponses: 9
    Dernier message: 07/11/2005, 13h25

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