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 :

Executer du code après un return ?


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert 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
    Par défaut Executer du code après un return ?
    Bonjour,

    Existe t'il une astuce pour exécuter du code après un return ?

    Je m'explique.
    Dans le cadre d'une instantiation je cherche à lire le namespace globals au sein même de l'instance. Hors c'est Python qui ajoute mon instance dans ce namespace via le key=instance.

    Dans le cadre des deux codes suivants l'__init__ est bien exécuté mais tant que Python n'as pas le retour d'__init__, soit l'instance, il n'y as pas d'entrée dans le globals().

    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
    class metavarclass(type):
        def __new__(cls, name, bases, dct):
            print "Allocation mémoire pour la class", name
            return type.__new__(cls, name, bases, dct)
     
        def __init__(self, name, bases, dct):
            super(metavarclass, self).__init__(name, bases, dct)
            print "Init de la class", self
     
    class varclass(object):
     
        __metaclass__ = metavarclass
     
        def __init__(self):
            self._name = None
     
        def getmyname(self):
            for keys in (keys for keys, values in globals().items() if values == self):
                print 'valeur trouvée', keys
                self._name=keys
     
    a=varclass()
    print "Après l'instanciation", a.getmyname()
    Ou

    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
    class varname(object):
        def getname(function):
            def mon_init(*args, **kwargs):
                instance = args[0]
                function(*args, **kwargs)
                print "Après l'init et dans getname:", instance.getmyname()
            return mon_init
     
        @getname
        def __init__(self):
            print 'Init de varname'
            self._name=None
     
        def getmyname(self):
            for keys in (keys for keys, values in globals().items() if values == self):
                print 'valeur trouvée:', keys
                self._name=keys
     
    a=varname()
    print "Après l'instanciation.", a.getmyname()
    Avez vous une idée ? (Ou je me plante ?)

    Merci

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    bonjour,

    selon moi (à prendre avec les précautions qui s'imposent :p) l'instruction:

    crée dans un premier temps l'instance correspondante et ensuite lie dans la portée globale le nom 'a' à cette instance.

    par conséquent, quelque soit la personnalisation de la création de l'instance, cela ne change en rien le fait que le nom soit lié après.

    En revanche tu peux arriver à faire quelque chose si la variable 'a' est associée à une classe que tu contrôles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Toto(object):
        pass
    t = Toto()
    t.a = varname()

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    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 716
    Par défaut
    Salut,
    Citation Envoyé par kango Voir le message
    En revanche tu peux arriver à faire quelque chose si la variable 'a' est associée à une classe que tu contrôles
    Pour insister sur "que tu contrôles".
    Python étant "dynamique", il est très facile de faire un "mock" i.e. remplacer un objet par un proxy à sa sauce qui pourra 'wrapper' les accès aux attributs de l'object "original".

    L'objet qui nous intéresse ici étant le __dict__ du module courant, nous pourrions imaginer de le "mocker" par un truc à nous qui ressemble à.
    *but* ce __dict__ là est malheureusement 'readonly'.
    Note: Ca limite les dégâts quand même...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre Expert 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
    Par défaut
    Bonjour,

    Citation Envoyé par kango Voir le message
    selon moi (à prendre avec les précautions qui s'imposent :p) l'instruction:

    crée dans un premier temps l'instance correspondante et ensuite lie dans la portée globale le nom 'a' à cette instance.

    par conséquent, quelque soit la personnalisation de la création de l'instance, cela ne change en rien le fait que le nom soit lié après.
    C'est bien ce que j'ai compris aussi kango. C'est le a=b() qui fait que a:b existe dans le namespace (voir mon key=instance).
    L'utilisation de l'__init__ (pour créer l'instance) n'est qu'un exemple: renvoyer l'__init__ (l'instance) à a=* et continuer le code après (getmyname).
    C'est bien sur ridicule et ne fonctionne pas puisque Python attend le retour de l'init pour faire son a=*.

    Citation Envoyé par kango Voir le message
    En revanche tu peux arriver à faire quelque chose si la variable 'a' est associée à une classe que tu contrôles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Toto(object):
        pass
    t = Toto()
    t.a = varname()
    Le code ne correspond pas à ce que je recherche mais s'approche d'une factory.
    C'est sans doute de ce coté que je dois rechercher mais, comme dirait wiztricks, je n'arrive qu'a sortir du code capillo-tractée.

    Je vais continuer dans ce sens.

    Merci

  5. #5
    Membre Expert 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
    Par défaut
    Et wiztricks à poster entre temps (il ne me manque plus que dividee et un 'arrête les hacks' )

    Eu..? C'est le namespace locals() qui est en lecture seule, pas le globals() Non ?
    J'essaie de lire celui ci donc pas de problème.

    C'est quoi cette histoire de mocker ? (Désolé pour mon manque de vocabulaire)

    Ok pour la note (j'ai assez fais d'expériences dessus )

    Merci

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 716
    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 716
    Par défaut
    Citation Envoyé par PauseKawa Voir le message
    Eu..? C'est le namespace locals() qui est en lecture seule, pas le globals() Non ?
    J'essaie de lire celui ci donc pas de problème.
    Yeap.
    Il s'agit en gros de changer le comportement de 'a = b' i.e. l'opération d'assignation ou de mise à jour d'une variable dans le dict du module qui se cache derrière "globals()" pour avoir un contrôle de ce qu'il s'y passe.

    Comme c'est un "dict" on pourrait imaginer le remplacer par un truc qui soit un dict "amélioré"... mais il ne se laisse par remplacer si facilement.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre Expert 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
    Par défaut
    Houla ! Cela me semble bien hasardeux avec mon niveau. J'ai bien tenté, il y a quelques temps, ce genre de manipulations avec la customisation des imports mais cela n'est pour moi qu'a titre expérimental.
    Je retiens l'idée pour mes weekend pluvieux

    J'aurais plus pensé à une vérification du namespace externe.
    L'__init__ lance une classe externe et lui donne l'instance (self).
    La classe externe (thread ?) regarde dans le namespace la présence de l'instance.
    Lorsque il trouve l'instance il lance l'instance.getmyname()
    Par contre cela me parait moche.

    Merci

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

Discussions similaires

  1. Executer du code aprés changement
    Par docjo dans le forum VBA Access
    Réponses: 4
    Dernier message: 18/08/2009, 16h23
  2. Executer du code vba apres un publipostage
    Par xcbilx dans le forum VBA Word
    Réponses: 6
    Dernier message: 10/04/2008, 00h53
  3. Réponses: 2
    Dernier message: 06/04/2006, 10h35
  4. Réponses: 4
    Dernier message: 15/12/2005, 18h28
  5. [C#]Comment executer du code qui se trouve dans une string ?
    Par freddyboy dans le forum Windows Forms
    Réponses: 4
    Dernier message: 28/02/2005, 16h31

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