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 :

Créer un "interrupteur" d'une portion de code. [Python 3.X]


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 42
    Points : 54
    Points
    54
    Par défaut Créer un "interrupteur" d'une portion de code.
    Bonjour,
    Désolé du titre peu explicite mais je ne savais comment le formuler autrement
    Je suis nouveau et j'ai créé un compte suite à une interrogation de mon prof et moi sur le codage d'une séquence d'instruction d'un automate.
    En fait l'automate est censé exécuter en boucle une séquence, et doit relancer la séquence si jamais une variable particulière (ma_variable) devient False. Concrètement j'ai un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while True:
        ... #Des instructions
    Mais si jamais à un QUELCONQUE moment ma_variable devient False, bim je relance la séquence. Un peu comme si j'avais la portion de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if not ma_variable:
        continue
    qui trainait à chaque étape (mais bon je ne peux pas mettre ça à chaque étape, et ça ne marche même pas si je suis dans une autre boucle bref.. !!)
    Pour préciser c'est un problème de SI, la variable est indépendante de mon code (un peu comme une variable qui vous dit s'il fait beau ou pas !) et j'ai des boucles de temporisation.
    Je sais que c'est pas un problème très malin à résoudre en programmation séquentielle, mais je me demandais toutefois s'il y avait une astuce (même compliqué). J'ai pensé à des exceptions, etc mais je vois pas trop. J'ai bidouillé un truc sur mon exemple mais je ne suis pas pleinement satisfait !

    Merci d'avoir pris le temps de lire et de m'aider, et n'hésitez pas à signaler si je n'ai pas été assez clair !

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Je ne vois pas spécialement de problème à ce que tu veux faire mais, sans connaître la structure de ton code, difficile de proposer quelque chose.

    Je suppose, bien évidement, que ta boucle est dans une fonction. Sans cela pas possible de la relancer.

  3. #3
    Membre expérimenté
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    946
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 946
    Points : 1 351
    Points
    1 351
    Par défaut
    Hello,

    En C on ferait un gros switch pour associer chaque cas à une étape, le tout dans une boucle conditionnée par ta variable. Même s'il n'y a pas de switch en python on peut faire quelquechose de similaire grâce à if/elif/else:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    while ma_variable:
        # switch
        if etat == 1:
            # case 1
            etape1()
        elif etat == 2:
            # case 2
            etape2()
        elif etat == 3:
            # case 3
            etape3()
        else:
            # default
            etape_default()
    A+

    Pfeuh

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Juste une autre idée:

    En supposant que la variable qui doit déclencher la reprise de la boucle while change de manière asynchrone (par un thread, un processus ou une interruption matérielle):

    les assert sont placés à chaque endroit où une rupture dans le déroulement du code est possible

    La condition des assert déclenche l'exception quand elle devient fausse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while True:
        try:
            ...
            assert(condition) # déclenche une exception quand la condition devient fausse
            ...
            assert(condition) # déclenche une exception quand la condition devient fausse
            ...
            assert(condition) # déclenche une exception quand la condition devient fausse
            ...
            assert(condition) # déclenche une exception quand la condition devient fausse
            ...
        except AssertionError:
            continue
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 42
    Points : 54
    Points
    54
    Par défaut
    Merci pour vos réponses rapides, en effet ce n'est pas très explicite mais je ne pense pas qu'il y ait un moyen simple, c'est à dire sans tester à chaque fois que nécessaire la condition (par un assert ou autre), vu que le flux d'information doit obligatoirement passer par cette condition (un peu comme le courant passe par l'interrupteur d'où le titre).
    Si personne n'a d'autres idée mon sujet est résolu.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par plaxtor Voir le message
    Merci pour vos réponses rapides, en effet ce n'est pas très explicite mais je ne pense pas qu'il y ait un moyen simple, c'est à dire sans tester à chaque fois que nécessaire la condition (par un assert ou autre), vu que le flux d'information doit obligatoirement passer par cette condition (un peu comme le courant passe par l'interrupteur d'où le titre).
    En fait, il y a un trop plein de façons de réaliser/coder cela.
    Après le choix dépend du contexte auquel il faudra adapter la mécanique.
    Mais comme vous ne montrez pas de code, pas facile de voir de quoi on parle.

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

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 42
    Points : 54
    Points
    54
    Par défaut
    Oui vous avez raison ! Justement je ne montre pas de code car mon exemple est excessivement simple et résoluble sans nécessairement se poser cette question, qui est purement théorique d'ailleurs mais je veut bien montrer mon exemple :
    Mon système est un véhicule téléguidé tout terrain qui doit se cabrer lorsque les roues avants tournent. J'ai donc une variable "rotation" qui vaut True/False (et qui dépend donc de l'environnement).
    Je doit coder quand le système doit se cabrer.
    La position de cabrage est atteinte au bout d'une seconde, durée pendant laquelle je doit maintenir l'ordre de cabrage. Le véhicule pourra se maintenir cabré durant 4 secondes, ensuite le débit de fuite du vérin lui fera reprendre sa position normale. Je devrait donc à ce moment là re-cabrer, et ainsi de suite. Si jamais "rotation" passe à False, alors je réinitialise tout.
    Concrètement ça donne :

    Si rotation :
    Cabrer 1s
    Attendre 4s

    Qui s'effectue en boucle, et qui repart du début dès que rotation passe à False.
    En supposant que j'ai la fonction time, j'ai codé ça part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while true:
        t0 = time()
        while rotation and time() - t0 < 1:
            cabrer()
        while rotation and time() - t0 < 5:
            pass
    Code qui marche très bien dans cet exemple simple.

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

    rotation reflétant l'état d'un système externe, impossible que ce soit une variable Python. D'ailleurs dans votre exemple, je ne vois pas trop comment elle pourrait changer d'état.
    On pourrait écrire:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def get_rotation():
         ...
    def cabrer():
         ...
    while true:
        t0 = time()
        while get_rotation() and time() - t0 < 1:
            cabrer()
        while get_rotation() and time() - t0 < 5:
            pass
    Mais pas facile de comprendre:
    La position de cabrage est atteinte au bout d'une seconde, durée pendant laquelle je doit maintenir l'ordre de cabrage. Le véhicule pourra se maintenir cabré durant 4 secondes, ensuite le débit de fuite du vérin lui fera reprendre sa position normale. Je devrait donc à ce moment là re-cabrer, et ainsi de suite. Si jamais "rotation" passe à False, alors je réinitialise tout.
    A mon sens, "get_rotation" et "cabrer" touchent des interfaces externes et changent l'état d'un objet physique qui aura une certaine inertie.
    Il n'est peut être pas utile d'appeler "get_rotation" et "cabrer" dès que possible.
    Si c'est le cas, on peut imaginer d'avoir une sorte de programmation événementielle.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    rotation = get_rotation()
    cabrage = Cabrage(rotation)
    while True:
        time.sleep(0.1) # ou un intervalle de temps plus petit.
        if rotation != get_rotation():
               cabrage.toggle()
               rotation = not(rotation)
        cabrage.update() # maybe...

    Et on a réalisé une sorte d'interrupteur.

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

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 42
    Points : 54
    Points
    54
    Par défaut
    Oui ça à l'air fonctionnel ainsi je saisi l'idée. Merci d'avoir pris le temps de me répondre je vais retravailler tout ça ! Ton premier code me parait parfait !

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 15/04/2009, 17h52

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