2009-07-23 5 views
0

Par exemple, si ce code était contenu dans un module appelé un_modulehiérarchie d'espace de noms python objet ci-dessus

class C: 
    class C2: 
     def g(self): 
      @printNamespaceAbove 
      def f(): 
       pass 

printNamespaceAbove serait alors défini de telle sorte que ce code renverrait quelque chose comme

[some_module,C,C2,g] 

Répondre

2

Il est aucun moyen de rendre ce code, comme présenté, avoir une sortie - le corps de g (y compris le décorateur que vous souhaitez faire l'impression) simplement ne fait pas exécuter jusqu'à ce que g est appelé. Je suppose que vous n'entendez pas littéralement que "ce code" produise quoi que ce soit, mais plutôt que vous ayez l'intention d'ajouter un appel tel que C.C2(). G() [qui fera réellement la sortie].

Il n'y a pas vraiment un moyen très efficace de le faire - vous (bien, le décorateur ;-) doit commencer au niveau du module (que vous pouvez identifier par les globales de f, l'argument du décorateur: son nom est f.func_globals['__name__'] et par son nom, vous pouvez le rechercher dans sys.modules), puis vous devez parcourir chaque chaîne de noms possible jusqu'à ce que vous localisiez votre fonction d'appel (par exemple via le module inspect dans la bibliothèque standard). Notez également que les fonctions imbriquées sont un casse-tête particulier dans plusieurs cas particuliers.

Questions connexes