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 :

Mise à jour automatiques de variables [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien informatique N2
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien informatique N2
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Par défaut Mise à jour automatiques de variables
    Bonjour tout le monde,

    Je travaille actuellement sur un programme sur le contrôle de ma VMC double Flux et j'ai un problème avec ce genre de code dont voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    a=2
    b=a
    print (a)
    print (b)
    a+=1
    print (a)
    print (b)
    Donc le résultat est
    2
    2
    3
    2

    Donc je comprend le résultat, aucun problème, à l'initialisation "b" prend le contenu de "a" qui est 2. Hors mon problème étant que je souhaiterait que "b" prenne le contenu de "a" lorsque je l'appel et non son contenu lors de l'initialisation car celui-ci est évolutif.

    En faite j'essaie d'éviter d'initialiser les variables évolutifs (car j'en ai plusieurs) à chaque fois que je souhaiterais m'en servir...
    Voici un exemple d'utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #Modification du débit
    client.write_register(address=16, value=140)
    debit = client.read_input_registers(address=16, count=1)
    print(datetime.now().strftime('[%d/%m/%Y %H:%M:%S]') + " | Débit de la VMC : " + format(debit.registers[0]))
    [...]
    #Modification du débit
    client.write_register(address=16, value=180)
    debit = client.read_input_registers(address=16, count=1)
    print(datetime.now().strftime('[%d/%m/%Y %H:%M:%S]') + " | Débit de la VMC : " + format(debit.registers[0]))
    Je voudrais également éviter de transformer cette ligne, pour un soucis de compréhension dans mes conditions if qui pourraient concerner des températures, des débits, etc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print(datetime.now().strftime('[%d/%m/%Y %H:%M:%S]') + " | Débit de la VMC : " + format((client.read_input_registers(address=16, count=1)).registers[0]))
    Quelqu'un à un idée ou une librairie qui pourrait faire ce travail ou est ce que je m'y prend mal ?

    Merci d'avance et bonne journée !

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

    Citation Envoyé par Raids Voir le message
    Quelqu'un à un idée ou une librairie qui pourrait faire ce travail ou est ce que je m'y prend mal ?
    Dans votre exemple, l'objet associé à vos variables n'est pas mutable.
    Associez leur un objet mutable (une liste ou une instance de classe par exemple) et vous pourrez modifier l'objet et accéder à ces modifications via les 2 "variables".

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

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien informatique N2
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien informatique N2
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Associez leur un objet mutable (une liste ou une instance de classe par exemple) et vous pourrez modifier l'objet et accéder à ces modifications via les 2 "variables".
    Salut,

    Merci pour votre réponse, mais une liste ne résout pas mon problème puisque c'est une donnée récupéré sur un automate, cette donnée n'étant pas une constante chaque lecture peut être différente, j'aimerai qu'à l'appel de la variable elle soit à jour sans aucune manipulation de ma part. Je cherche quelque chose qui a l'initialisation, la variable dispose d'un moyen de pouvoir retourner la valeur d'une méthode et bien évidemment une valeur qui est à jour, pas celle de l'initialisation.

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 : 4 062
    Par défaut
    Bonjour,

    Quand vous faîtes b=a ce n'est pas une manipulation de votre part ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Technicien informatique N2
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien informatique N2
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Bonjour,

    Quand vous faîtes b=a ce n'est pas une manipulation de votre part ?
    Le problème étant que je ne souhaite pas reproduire cette ligne partout dans mon code à chaque fois que je souhaite une valeur à jour...

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Citation Envoyé par Raids Voir le message
    une liste ne résout pas mon problème puisque c'est une donnée récupéré sur un automate, cette donnée n'étant pas une constante chaque lecture peut être différente
    Pour utiliser la donnée récupérée sur l'automate, il faut bien la stocker quelque par.
    Ce sera un objet qui sera mutable ou pas: çà c'est votre choix et si vous avez choisi de programmer avec Python, ce choix a des conséquences et il faudra faire avec (ou autrement).

    C'est quand même pas compliqué d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> a = [2]
    >>> b = a
    >>> a[0] = 'xxx'
    >>> b
    ['xxx']
    >>>
    sauf quand on se lance à programmer avec Python sans avoir pris le temps d'ouvrir un tuto. pour apprendre les bases.

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

  7. #7
    Membre à l'essai
    Homme Profil pro
    Technicien informatique N2
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien informatique N2
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    C'est quand même pas compliqué d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> a = [2]
    >>> b = a
    >>> a[0] = 'xxx'
    >>> b
    ['xxx']
    >>>
    Aaaaahhhhh
    Mais j'avais mal compris, j'avais fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> a=[2]
    >>> b=a[0]
    >>> a[0]=['xxx']
    >>> b
    2
    Donc ok nickel merci pour votre aide

    sauf quand on se lance à programmer avec Python sans avoir pris le temps d'ouvrir un tuto. pour apprendre les bases.
    Par contre ce genre de remarque désobligeante ça n'a rien à faire ici vous pouvez la garder , bien sûr que j'ai déjà ouvert des tutos mais je crois bien qu'on est ici sur un forum d'entraide et aussi pour éclaircir peut-être certains points qui peuvent être flou ou avoir été mal compris , merci quand même pour l'aide !

  8. #8
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Bonjour,
    Citation Envoyé par Raids Voir le message
    En faite j'essaie d'éviter d'initialiser les variables évolutifs (car j'en ai plusieurs) à chaque fois que je souhaiterais m'en servir...
    Voici un exemple d'utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #Modification du débit
    client.write_register(address=16, value=140)
    debit = client.read_input_registers(address=16, count=1)
    print(datetime.now().strftime('[%d/%m/%Y %H:%M:%S]') + " | Débit de la VMC : " + format(debit.registers[0]))
    [...]
    #Modification du débit
    client.write_register(address=16, value=180)
    debit = client.read_input_registers(address=16, count=1)
    print(datetime.now().strftime('[%d/%m/%Y %H:%M:%S]') + " | Débit de la VMC : " + format(debit.registers[0]))
    Pour éviter de réécrire debit = client.read_input_registers(address=16, count=1), il y a plusieurs solutions.

    Je ne connais pas assez le contexte pour savoir s'il y a besoin de sortir l'artillerie lourde. Mais, au cas où, voici quelques approches en plus :

    Une première solution est de créer une fonction get_debit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def get_debit():
        return client.read_input_registers(address=16, count=1)
    Dans le code appelant, on aura alors debit = get_debit().

    Une autre solution est d'utiliser le patron de conception Observateur. Dans ton observable, la fonction qui appelle client.write_register notifiera les observateurs. Parmi les observateurs, tu peux mettre une classe qui contient un attribut debit et qui met à jour sa valeur dès qu'il est notifié. L'observateur peut aussi loguer le changement de débit.

    Cela dit, implémenter à la main le patron de conception Observateur est lourd.

    Avoir des variables qui dépendent d'autres et qui sont automatiquement mises à jour quand les variables dont elles dépendent sont modifiées, c'est l'objet d'un paradigme qu'on appelle la programmation réactive. Je te laisse lire le lien Wikipédia anglais.
    Pour la programmation réactive, de ce que j'avais lu sur internet, parmi les bibliothèques, il me semble que la plus connue est ReactiveX qui existe dans plusieurs langages, dont Python avec RxPY. Néanmoins, attention que ReactiveX n'empêche pas les glitches.
    Remarque 1 : je préviens que je n'ai encore jamais fait de programmation réactive en Python. En particulier, je n'ai pas testé RxPY.
    Remarque 2 : si tu n'as que des mises à jour simples de la forme b = a, alors la programmation réactive sera overkill.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Technicien informatique N2
    Inscrit en
    Février 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien informatique N2
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2019
    Messages : 5
    Par défaut
    Citation Envoyé par Pyramidev Voir le message
    Une première solution est de créer une fonction get_debit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def get_debit():
        return client.read_input_registers(address=16, count=1)
    Dans le code appelant, on aura alors debit = get_debit().
    Raah mais pourquoi j'ai pas pensé à ça avant !!! Bah oui une fonction qui me retourne ce que j'ai besoin c'est super ! Je pense pas assez à faire des fonctions...
    Merci pour cette solution, je vais me faire des getters et des setters pour les adresses que j'ai besoin de lire et d'écrire, ça simplifiera la compréhension du code comme je voulais, MERCI . En faite j'ai cherché trop compliqué...

    Pour ce qui concerne les observateurs je vais mettre ça de côté, je connaissait pas mais c'est intéressant comme fonctionnalité. Ca va pas me servir ici car en faite je modifie le débit et c'est la carte mère de la VMC qui me donne directement la valeur du débit pour m'assurer qu'elle a bien prise en compte ma modification. ^^"
    Et puis je fais déjà du Logs avec un rapport datés toutes les minutes des températures, de la vitesses, des moteurs et du débit, pour voir comment le tout se comporte sur la journée avec les douches, le chauffage, les températures extérieurs tout ça quoi ^^"

    D'accord pour la programmation réactive, ça m'a l'air vraiment poussé comme librairie, je pense pas en avoir besoin non plus pour si peu ^^. Désolé d'avoir demandé un truc si simple, je suis un amateur c'est pas mon métier, j'ai eu des cours quand j'étais étudiant à l'université, j'ai suivis des tutos et j'ai décidé de faire ce projet de domotique car j'aimais bien les cours de programmations =)

    Merci @Pyramidev, bonne journée !

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

Discussions similaires

  1. [AC-2010] mise à jour variable clé ou création avec outil externe
    Par Lys_L dans le forum Access
    Réponses: 2
    Dernier message: 04/10/2013, 14h56
  2. Problème mise à jour variable dans workspace
    Par Xen956 dans le forum Interfaces Graphiques
    Réponses: 4
    Dernier message: 24/04/2012, 21h11
  3. [DOM] Parser un fichier xml avec mise à jour variable
    Par toussef dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 20/01/2010, 11h48
  4. Réponses: 6
    Dernier message: 09/09/2008, 17h36
  5. SSIS : mise à jour variable
    Par kaboume dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/08/2006, 11h25

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