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 :

assert list string


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Points : 109
    Points
    109
    Par défaut assert list string
    Bonjour,

    Je veux réaliser un assert sur une liste de champs pour vérifier s'il existe bien deux champs qui sont nécessaires au traitement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    champs=[u'FID', u'Shape', u'IDM', u'ORG', u'NOM', u'GEN']
    Si je fais assert 'IDM' in champs, ça fonctionne mais je ne vois pas comment faire pour passer le second paramètre ? A moins de réaliser deux asserts.

    assert ('IDM','GEN') in champs ne fonctionne pas.

    Merci d'avance

  2. #2
    Expert éminent

    Avatar de deusyss
    Homme Profil pro
    Expert Python
    Inscrit en
    Mars 2010
    Messages
    1 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Expert Python
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 659
    Points : 8 442
    Points
    8 442
    Par défaut
    A ma connaissance cela n'est pas possible.

    Tu dois le vérifier en deux temps, avec deux if imbriqués par exemple
    "La connaissance appartient à tout le monde" (Film Antitrust)

    Tout le nécessaire pour Python:
    *News/Accueil *Cours/tutoriels *FAQ
    *Forums *Outils dédiés *Mon espace personnel avec mes Articles, Cours et Tutoriels

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Points : 109
    Points
    109
    Par défaut
    ok ,merci
    ce genre de script n'est pas correct?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try:
        champs_verif1=arcpy.ListFields(table1)
        assert 'IDM'in champs_verif1
        assert 'GEN'in champs_verif1
    except AssertionError:
        print "vérifier la structure des tables"
    merci

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Salut,

    assert est une construction de "debug" qui est intéressante car on peut les neutraliser sans éditer le code: pas besoin de les enfermer dans des try..except.. vous pourriez écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    champs_verif1=arcpy.ListFields(table1)
    assert 'IDM' in champs_verif1, "vérifier la structure des tables"
    assert 'GEN' in champs_verif1, "vérifier la structure des tables"
    Si vous voulez remonter l'exception i.e. utilisez AssertionError, il faudrait plutôt écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for v in ('IDM', 'GEN'):
         if v not in champs_verif1:
              raise AssertionError("vérifier la structure des tables")
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Points : 109
    Points
    109
    Par défaut
    ok, ça roule merci pour les explications

    En fait,j'aurais encore juste une petite question. si je veux faire un assert pour vérifier si la table contient une valeur null
    je pensais que assert champs==None,message pouvait suffire mais cela ne fonctionne pas car j'ai tjrs le message assertionerror même si je n'ai pas de valeurs null.?

    merci d'avance

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Points : 109
    Points
    109
    Par défaut
    ok alors avec ta deuxieme solution wiztricks cela fonctionne...
    je vois pas trop pourquoi mais bon...

  7. #7
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 808
    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 : 3 808
    Points : 7 086
    Points
    7 086
    Par défaut
    assert vérifie une condition. Si elle n'est pas respectée, une erreur de type AssertionError est levée.

    On peut très bien lever manuellement une erreur du même type (raise AssertionError) en imposant nos conditions.

    Rien n'empêche de faire cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    champs = [u'FID', u'Shape', u'IDM', u'ORG', u'NOM', u'GEN']
     
    for ch in (u'GEN', u'IDM'):
        assert ch in champs
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bernards111 Voir le message
    si je veux faire un assert pour vérifier si la table contient une valeur null. je pensais que assert champs==None,message pouvait suffire mais cela ne fonctionne pas car j'ai tjrs le message assertionerror même si je n'ai pas de valeurs null.?
    Bonjour
    C'est nomal, tu demandes de vérifier qu'il y a un null et tu dis toi-même qu'il n'y en a pas. C'est normal que t'aies une remontée d'exception !!!

    Ceci dit, on ne peut pas être égal au néant, on ne peut qu'être ou ne pas être le néant. La bonne syntaxe pour vérifier None est donc assert variable is None. Et ce pour une bonne et simple raison (qui est tout de même un peu plus importante qu'un simple concept de sémantique), c'est que l'opérateur == qui n'a l'air de rien est tout de même très complexe (il peut être surchargé, il fait appel à l'opérateur __eq__ si celui-ci existe, sinon ce sera l'opérateur __cmp__) alors que l'opérateur is reste toujours le plus simple possible et ne peut faire l'objet d'aucune surcharge.

    Un exemple simple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> class toto:
    ...   def __eq__(self, x): return True
    ...
    >>> a=toto()
    >>> a == None
    True
    >>> a is None
    False
    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
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Points : 109
    Points
    109
    Par défaut
    ok,je comprend mieux maintenant .merci
    j'avais des valeurs null reconnu comme None mais aussi des valeurs reconnu comme des string vides>> u''
    par contre pour ces string le "is" ne fonctionne pas et je suis apparemment obligé d'utilisé l'opérateur ==....

    sinon j'ai un peu du mal à évaluer cette notion de surcharge??

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Salut,

    Le "null" des bases de données doit remonter en None côté Python.
    La chaîne vide (u'') traduit autre chose que "null".
    Je ne comprends pas pourquoi vous passez par '=='!

    Soit v dans (None, False, ''), bool(v) est False dans tous les cas.
    Il suffit donc d'écrire "assert v, message" pour s'assurer (si c'est ce que vous souhaitez) que v n'est pas...

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

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Points : 109
    Points
    109
    Par défaut
    voila un bout de mon code..;
    en gros je parcours une table et créée deux listes de valeurs sans doublons.je m'en sers après pour filtrer la table
    mon but est d’arrêter le script lorsque une des deux listes à une valeur null ou un string vide car j'utilise le "cd" pour créer un png en sortie et le nom pour le titre sur le png.

    mais voilà , suis désolé mais je ne vois pas comment lever l'exception autrement...

    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
     
    code = []
    n = []
    i=0
     
    fields= [CD,LB]
    inv=r"c:\path...."    
     
     
    with (arcpy.da.SearchCursor (inv,fields)) as cur:
     
     
        for num,row in enumerate (cur):
            cd = row[0]
            if cd is None:
                raise AssertionError("il existe un cd null ligne %i dans la table, ajouter le ou enlever la ligne de l'inventaire..." % num)
            if cd == "":
                raise AssertionError("il existe un cd null ligne %i dans la table, ajouter le ou enlever la ligne de l'inventaire..." % num)
            nom = row[1]
            if nom is None:
               raise AssertionError("il existe un nom null ligne %i dans la table, la carte n'aura pas de titre..." % num)
            if nom == "":
               raise AssertionError("il existe un nom null ligne %i dans la table, la carte n'aura pas de titre..." % num)
     
     
            try:
                code.index(cd)
            except ValueError:
                code.append (cd)
                n.append (nom)
                i=i+1

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 277
    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 277
    Points : 36 762
    Points
    36 762
    Par défaut
    Vous devriez pouvoir écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        for num,row in enumerate (cur):
            cd = row[0]
            if not cd:
                raise AssertionError("il existe un cd null ligne %i dans la table, ajouter le ou enlever la ligne de l'inventaire..." % num)
            nom = row[1]
            if not nom:
               raise AssertionError("il existe un nom null ligne %i dans la table, la carte n'aura pas de titre..." % num)
            ...
    ou encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        for num,row in enumerate (cur):
            cd = row[0]
            assert cd, "il existe un cd null ligne %i dans la table, ajouter le ou enlever la ligne de l'inventaire..." % num
            nom = row[1]
            assert nom, "il existe un nom null ligne %i dans la table, la carte n'aura pas de titre..." % num
            ...
    Ce qu'il faudrait essayer de comprendre est qu'assert ou if évaluent une expression booléenne.
    La valeur "booleenne" de la chaîne vide ou de None étant tout deux "False" pas besoin de tester séparément.

    Ignorant cela, rien ne vous empêche d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        for num,row in enumerate (cur):
            cd = row[0]
            if cd is None or cd == '':
                raise AssertionError("il existe un cd null ligne %i dans la table, ajouter le ou enlever la ligne de l'inventaire..." % num)
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    321
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 321
    Points : 109
    Points
    109
    Par défaut
    ok, merci

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

Discussions similaires

  1. [C# 2.0] Détecter les doublons dans une List<string>
    Par Rodie dans le forum Windows Forms
    Réponses: 36
    Dernier message: 30/03/2013, 15h21
  2. List<String> avec jdk1.6.0_01.
    Par shiryuseiya dans le forum Eclipse Java
    Réponses: 13
    Dernier message: 06/04/2008, 10h21
  3. Serialisés et désérialisé une List<String>
    Par Premium dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 28/12/2006, 03h48
  4. Conversion String Collection en List <String>
    Par Seth77 dans le forum Framework .NET
    Réponses: 2
    Dernier message: 21/11/2006, 09h57
  5. Conversion List -> String
    Par Bayard dans le forum Général Python
    Réponses: 1
    Dernier message: 27/11/2005, 21h50

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