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 :

problème de syntaxe avecif else


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Par défaut problème de syntaxe avecif else
    Je suis novice en python. Je fais ce bout de code pour calculer le nombre de registre des fonction Modbus Pour cela j'ai besoin de faire une vérification qui est la suivant:
    Si funcCode est différent de 5 et 6 faire ceci: r.append (p ['ModbusADURequest'] [1] .startAddr) sinon faire r.append (p ['ModbusADURequest'] [1]. RegisterAddr ) mais j'ai une erreur:
    File" parserz.py ", ligne 868 else: ^ SyntaxError: syntaxe invalide
    ça doit être une erreur d'indentation ou autre mais je vois pas où.

    Une idée s'il vous plait ?


    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 reg_no_list(s):
    	r = []
    	for p in s:
    		if (p['ModbusADUResponse'][1].funcCode != int("0x06", 16)) and (p['ModbusADUResponse'][1].funcCode != int("0x05", 16)):
     
    			if p.haslayer('ModbusADURequest'):
    				try:
    					r.append(p['ModbusADURequest'][1].startAddr)
    				except AttributeError:
    					pass
    			return r
    		else:
    			r.append(p['ModbusADURequest'][1]. registerAddr)
    		except AttributeError:
    				pass
    	return r
     
    def reg_val_list(s):
    	v = []
    	for p in s:
    		if (p['ModbusADUResponse'][1].funcCode != int("0x06", 16)) and (p['ModbusADUResponse'][1].funcCode != int("0x05", 16)):
     
     
    		if p.haslayer('ModbusADUResponse'):
    			try:
    				v += p['ModbusADUResponse'][1].registerVal
    			except AttributeError:
    				pass
    	return v
     
    	else:
     
                    v += p['ModbusADUResponse'][1]. registerValue
                except AttributeError:
                    pass
        return v

  2. #2
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    le else à la ligne 31 est un peu étrange, non ?
    et le except ligne 34 ?
    Sinon, pas de message d'erreur ?
    Code incompréhensible pour moi sinon.

  3. #3
    Membre averti
    Femme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Par défaut
    En fait, Le code initial était celui là (code 1):

    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
    def reg_no_list(s):
    	r = []
    	for p in s:
    		if p.haslayer('ModbusADURequest'):
    			try:
    				r.append(p['ModbusADURequest'][1].startAddr)
    			except AttributeError:
    				pass
    	return r
     
    def reg_val_list(s):
    	v = []
    	for p in s:
    		if p.haslayer('ModbusADUResponse'):
    			try:
    				v += p['ModbusADUResponse'][1].registerVal
    			except AttributeError:
    				pass
    	return v
    Puis maintenant je chercher à ajouter la condition suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (p['ModbusADUResponse'][1].funcCode != int("0x06", 16)) and (p['ModbusADUResponse'][1].funcCode != int("0x05", 16)):
    Si la condition est satisfaite, on fait le code 1 sinon on fait le code 2 :

    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
     def reg_no_list(s):
        r = []
        for p in s:
            if p.haslayer('ModbusADURequest'):
                try:
                    r.append(p['ModbusADURequest'][1]. registerAddr)
                except AttributeError:
                    pass
        return r
     
    def reg_val_list(s):
        v = []
        for p in s:
            if p.haslayer('ModbusADUResponse'):
                try:
                    v += p['ModbusADUResponse'][1]. registerValue
                except AttributeError:
                    pass
        return v

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par salwa17 Voir le message
    En fait, Le code initial était celui là (code 1):

    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
    def reg_no_list(s):
    	r = []
    	for p in s:
    		if p.haslayer('ModbusADURequest'):
    			try:
    				r.append(p['ModbusADURequest'][1].startAddr)
    			except AttributeError:
    				pass
    	return r
     
    def reg_val_list(s):
    	v = []
    	for p in s:
    		if p.haslayer('ModbusADUResponse'):
    			try:
    				v += p['ModbusADUResponse'][1].registerVal
    			except AttributeError:
    				pass
    	return v
    Puis maintenant je chercher à ajouter la condition suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (p['ModbusADUResponse'][1].funcCode != int("0x06", 16)) and (p['ModbusADUResponse'][1].funcCode != int("0x05", 16)):
    Si la condition est satisfaite, on fait le code 1 sinon on fait le code 2
    Ce que tu appelles "code" sont en réalité des fonctions. Il faut déjà nommer les choses correctement.
    Et le souci, c'est que les fonctions sont appelées sans savoir si la condition sera/ne sera pas validée.
    Donc soit tu répètes la condition dans chacune des fonctions en l'inversant dans la seconde (et en te souvenant que quand on inverse une condition on inverse aussi ses connecteurs "and"/"or")
    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
    def reg_no_list(s):
    	r = []
    	for p in s:
    		if p.haslayer('ModbusADURequest') and p['ModbusADUResponse'][1].funcCode != int("0x06", 16) and p['ModbusADUResponse'][1].funcCode != int("0x05", 16):
    			try:
    				r.append(p['ModbusADURequest'][1].startAddr)
    			except AttributeError:
    				pass
    	return r
     
    def reg_val_list(s):
    	v = []
    	for p in s:
    		if p.haslayer('ModbusADUResponse') and (p['ModbusADUResponse'][1].funcCode == int("0x06", 16) or p['ModbusADUResponse'][1].funcCode == int("0x05", 16):
    			try:
    				v += p['ModbusADUResponse'][1].registerVal
    			except AttributeError:
    				pass
    	return v
    soit tu réorganise tes deux fonctions (qui en plus sont quand-même très ressemblantes) en une seule qui pourra alors faire toutes les actions selon les conditions

    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
    def reg_list(s):
    	r = []
    	for p in s:
    		if p['ModbusADUResponse'][1].funcCode != int("0x06", 16) and p['ModbusADUResponse'][1].funcCode != int("0x05", 16):
    			if p.haslayer('ModbusADURequest'):
    				try:
    					r.append(p['ModbusADURequest'][1].startAddr)
    				except AttributeError:
    					pass
    				# try
    			# if
    		else:
    			if p.haslayer('ModbusADUResponse'):
    				try:
    					r += p['ModbusADUResponse'][1].registerVal
    				except AttributeError:
    					pass
    				# try
    			# if
    		# if
    	# for
    	return r
    # reg_list()
    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
    Membre averti
    Femme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2017
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2017
    Messages : 43
    Par défaut
    Merci de votre aide précieuse.

    J'ai adapté les solutions que vous avez postées en fonction de mon besoin et voici le 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
    def reg_no_list(s):
    	r = []
    	for p in s:
    		if p['ModbusADURequest'][1].funcCode != int("0x06", 16) and p['ModbusADURequest'][1].funcCode != int("0x05", 16):
    			if p.haslayer('ModbusADURequest'):
    				try:
    					r.append(p['ModbusADURequest'][1].startAddr)
    				except AttributeError:
    					pass
    				# try
    			# if
    		else:
    			if p.haslayer('ModbusADURequest'):
    				try:
    					r.append(p['ModbusADURequest'][1].registerAddr)
    				except AttributeError:
    					pass
    				# try
    			# if
    		# if
    	# for
    	return r
    def reg_val_list(s):
    	v = []
    	for p in s:
    		if p['ModbusADURequest'][1].funcCode != int("0x06", 16) and p['ModbusADURequest'][1].funcCode != int("0x05", 16):
    			if p.haslayer('ModbusADUResponse'):
    				try:
    					r.append(p['ModbusADUResponse'][1].registerVal)
    				except AttributeError:
    					pass
    				# try
    			# if
    		else:
    			if p.haslayer('ModbusADUResponse'):
    				try:
    					r.append(p['ModbusADUResponse'][1].registerValue)
    				except AttributeError:
    					pass
    ça compile bien mais quand je compile le main, j'ai ce message:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Traceback (most recent call last):
      File "main.py", line 334, in <module>
        main()
      File "main.py", line 323, in main
        data = retrieve(parameters, sbs)
      File "main.py", line 78, in retrieve
        p["Register_number"] = parser.reg_no_list(s)
      File "C:\Users\ensibs\Documents\V14-copie\Final\parserz.py", line 860, in reg_no_list
        if p['ModbusADURequest'][1].funcCode != int("0x06", 16) and p['ModbusADURequest'][1].funcCode != int("0x05", 16):
      File "C:\Users\ensibs\AppData\Local\Programs\Python\Python37\lib\site-packages\scapy\packet.py", line 1171, in __getitem__
        raise IndexError("Layer [%s] not found" % lname)
    IndexError: Layer ['ModbusADURequest'] not found
    Avez-vous une idée ?

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par salwa17 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Traceback (most recent call last):
      File "main.py", line 334, in <module>
        main()
      File "main.py", line 323, in main
        data = retrieve(parameters, sbs)
      File "main.py", line 78, in retrieve
        p["Register_number"] = parser.reg_no_list(s)
      File "C:\Users\ensibs\Documents\V14-copie\Final\parserz.py", line 860, in reg_no_list
        if p['ModbusADURequest'][1].funcCode != int("0x06", 16) and p['ModbusADURequest'][1].funcCode != int("0x05", 16):
      File "C:\Users\ensibs\AppData\Local\Programs\Python\Python37\lib\site-packages\scapy\packet.py", line 1171, in __getitem__
        raise IndexError("Layer [%s] not found" % lname)
    IndexError: Layer ['ModbusADURequest'] not found
    Avez-vous une idée ?
    Oui, on a tous une idée et tous probablement la même: la clef "ModbusADURequest" n'existe pas dans ton dico. Proablement parce que dans la fonction "reg_val_list(s)" tu lui passes pas le même "s" que dans la fonction "reg_no_list(s)"
    Et faudrait un peu te sortir les doigts quoi. Parce que si tu dois venir sur le forum demander de t'expliquer les messages Python élémentaires que tu auras durant ta phase de dev tu n'iras pas bien loin !!!

    Citation Envoyé par salwa17 Voir le message
    J'ai adapté les solutions que vous avez postées en fonction de mon besoin
    Visiblement ton adaptation a foiré !!!
    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.

Discussions similaires

  1. Problème syntaxe If .. Else
    Par NeverKevin dans le forum Excel
    Réponses: 2
    Dernier message: 02/02/2014, 17h59
  2. [CR XI] Problème de syntaxe IF-ELSE || IF-ELSEIF-ELSE
    Par ygyongy dans le forum Formules
    Réponses: 3
    Dernier message: 23/07/2013, 17h30
  3. [Mail] Problème de syntaxe else if
    Par texas dans le forum Langage
    Réponses: 18
    Dernier message: 07/10/2006, 14h47
  4. Problème de syntaxe ADO ...
    Par bendev dans le forum ASP
    Réponses: 2
    Dernier message: 15/04/2004, 14h38
  5. Réponses: 2
    Dernier message: 08/03/2004, 15h10

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