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 :

Supprimer une key du locals() du parent ?


Sujet :

Python

  1. #1
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut Supprimer une key du locals() du parent ?
    Bonsoir,

    Suite à ce sujet je recherche depuis un moment à savoir comment supprimer une key du locals() du parent. En fait je pense que je me perd dans mes recherches...
    J'arrive bien à avoir le nom du parent (soit par inspect, soit par le _getframe de sys) mais je n'arrive pas a utiliser ce string...

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    # class myvar for jlg_47
    # http://www.developpez.net/forums/d915461/autres-langages/python-zope/general-python/crash-aleatoire-thread/
    # Based on Tkinter variable class
     
    import inspect
    import sys
     
     
     
     
    class myvar(object):
        _default = ""
        def __init__(self, master=None, value=None, name=None, trace=None, mode=None):
            if not master:
                self._master = self
            self._master = master
            if value is not None:
                self._value=value
            else:
                self._value=self._default
            if trace:
                self._trace=trace
            else:
                self._trace=None
            if mode:
                self._mode=mode
            else:
                self._mode=None
            self._oldmode=None
            self._oldtrace=None
            if name:
                self._name = name
                print inspect.stack()[1][3]
                print sys._getframe(1).f_code.co_name
            else:
                self._name = str(inspect.stack()[1][4]).partition('=myvar(')[0][2:].replace(' ', '').replace('self.', '')
                # Oui, c'est moche. Donc TODO mais plus tard.
            globals()[self._name] = self
     
        def __str__(self):
            return str(self._name)
     
        def set(self, value):
            self._value=value
            if self._trace is not None and (self._mode == 'u' or self._mode == 'w'):
                self.savetrace()
                self._oldtrace()
            elif self._oldtrace is not None:
                self.restauretrace()
     
        def get(self):
            if self._trace is not None and (self._mode == 'u' or self._mode == 'r'):
                self.savetrace()
                self._oldtrace()
            elif self._oldtrace is not None:
                self.restauretrace()
            return self._value
     
        def trace_variable(self, mode, callback):
            self._mode=mode
            self._trace=callback
     
        trace = trace_variable
     
        def trace_vdelete(self):
            self._mode=None
            self._trace=None
     
        def trace_vinfo(self):
            return self._mode, self._trace
     
        def varinfo(self):
            return "Master", self._master, "Name", self._name, "Value", str(self._value), "Trace callback", self._trace, "Trace mode", self._mode
     
        # TODO For callback recursion
        def restauretrace(self):
            self._trace=self._oldtrace
            self._mode=self._oldmode
            self._oldtrace=None
            self._oldmode=None
     
        def savetrace(self):
            self._oldtrace=self._trace
            self._oldmode=self._mode
            self._trace=None
            self._mode=None
     
    if __name__ == "__main__":
        a=myvar()
     
        # Set a value
        a.set(10)
     
        # trace value
        def callback():
            b=myvar(name='b')
            print 'locals >', locals()
        a.trace('u', callback)
        a.set(20)
        print 'globals >', globals()
    Merci de me remettre dans le bon chemin svp.

    Bon code et @+
    Merci d'utiliser le forum pour les questions techniques.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Points : 1 384
    Points
    1 384
    Par défaut
    Je n'ai pas vraiment essayé de comprendre ton code, mais as-tu vu que dans la doc du built-in locals() il y a:
    Warning: The contents of this dictionary should not be modified; changes may not affect the values of local variables used by the interpreter.
    ?

    Et je ne comprends pas le principe. Tu veux supprimer une variable locale de l'appelant ? Cela me semble aller à l'encontre de la sémantique du langage, je ne pense pas que ce soit possible.

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour dividee,

    J'avais bien vus ce passage sur locals(). Et un simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if __name__ == "__main__":
        # Locals and Globals variables refer to the same object instance.
        def func2():
            d=myvar(value=10)
            del locals()['d'] # Inefficace comme indiqué dans la doc
            d=1 # C'est la mon souci
            print locals()
     
        func2()
        print d.get()
        print globals()
    Montre que tu as raison de me le rappeler.

    Ce qui me gène dans la façon de faire c'est le fait d'avoir mon objet dans locals() et dans globals().

    En fait cela n'est pas un souci au niveau du code du fait que le globals()[self._name] = self ne fait que créé une clé dans globals() qui est en fait le même objet. Sauf dans le cadre d'une nouvelle affectation (voir d=1)...

    Je vais sans doute devoir me tourner vers les solutions que vous m'avez donner dans le premier sujet mais je dois avouer que j'ai du mal.
    Après de seines lectures sur le web je commence à en comprendre la théorie mais je ne cerne pas sa mise en pratique dans mon cas...

    Merci de ta réponse.

    Edit : Je viens de relire le premier sujet et c'est bien plus clair ce matin.
    Je pense pouvoir m'en sortir.

    Merci
    Merci d'utiliser le forum pour les questions techniques.

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

Discussions similaires

  1. supprimer une table dans une base de donnée locale (sdf)
    Par vinowan dans le forum Windows Forms
    Réponses: 0
    Dernier message: 17/03/2009, 10h29
  2. Réponses: 2
    Dernier message: 26/12/2008, 15h34
  3. Supprimer une table d'une table "parente"
    Par Lize50 dans le forum SAS Base
    Réponses: 5
    Dernier message: 13/06/2008, 10h54
  4. Supprimer une section parente
    Par Pfeffer dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 19/10/2007, 13h25
  5. Réponses: 3
    Dernier message: 10/08/2007, 16h17

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