J'ai essayé "Comment obtenir une méthode décorée en Python"

Histoire originale: Comment obtenir la méthode décorée en Python

Dans le blog d'origine, j'ai utilisé le module * inspect *, mais il est pratique d'utiliser le module * ast *.

find_decorator.py


# -*- coding: utf-8 -*-
import ast

source = """
class Sample(object):

    @foo_decorator2
    @foo_decorator1
    def foo(self):
        pass

    @bar_decorator
    def bar(self):
        pass

    def baz(self):
        pass

@hoge_decorator2
@hoge_decorator1
def hoge(x):
    pass

def fuga(x):
    pass
"""

class FindDecorator(ast.NodeVisitor):
    def visit_FunctionDef(self, node):
        decorators = node.decorator_list
        if decorators:
            print('decorated: {}'.format(node.name))
            for name in decorators:
                print('decorator: {}'.format(name.id))
            print('-' * 32)
        return node

FindDecorator().visit(ast.parse(source))

Comme ça.

$ python find_decorator.py 
decorated: foo
decorator: foo_decorator2
decorator: foo_decorator1
--------------------------------
decorated: bar
decorator: bar_decorator
--------------------------------
decorated: hoge
decorator: hoge_decorator2
decorator: hoge_decorator1
--------------------------------

Post-scriptum: J'ai également pu obtenir dynamiquement le code source d'un module en utilisant * inspect.getsource *.

3.4


# -*- coding: utf-8 -*-
import ast
import inspect
import sys

def foo_decorator2(func): pass
def foo_decorator1(func): pass
def bar_decorator(func): pass
def hoge_decorator2(func): pass
def hoge_decorator1(func): pass

class Sample(object):

    @foo_decorator2
    @foo_decorator1
    def foo(self):
        pass

    @bar_decorator
    def bar(self):
        pass

    def baz(self):
        pass

@hoge_decorator2
@hoge_decorator1
def hoge(x):
    pass

def fuga(x):
    pass

class FindDecorator(ast.NodeVisitor):
    def visit_FunctionDef(self, node):
        decorators = node.decorator_list
        if decorators:
            print('decorated: {}'.format(node.name))
            for name in decorators:
                print('decorator: {}'.format(name.id))
            print('-' * 32)
        return node

module = sys.modules[__name__]
source = inspect.getsource(module)
FindDecorator().visit(ast.parse(source))

Vous pouvez obtenir le code source de l'objet passé dans l'argument de * inspect.getsource *. Ici, le module lui-même est passé, mais les classes et les fonctions peuvent également être passées.

Recommended Posts

J'ai essayé "Comment obtenir une méthode décorée en Python"
Comment obtenir stacktrace en python
J'ai essayé d'implémenter un pseudo pachislot en Python
J'ai essayé de résumer comment utiliser les pandas de python
J'ai essayé d'implémenter un automate cellulaire unidimensionnel en Python
Comment utiliser la méthode __call__ dans la classe Python
Comment obtenir la dernière (dernière) valeur d'une liste en Python
Comment obtenir une liste d'exceptions intégrées pour python
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'implémenter la permutation en Python
J'ai essayé d'implémenter PLSA dans Python 2
J'ai essayé d'implémenter ADALINE en Python
J'ai essayé d'implémenter PPO en Python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
Comment obtenir une chaîne à partir d'un argument de ligne de commande en python
J'ai essayé de mettre en œuvre un jeu de dilemme de prisonnier mal compris en Python
J'ai essayé de créer une méthode de super résolution / ESPCN
Comment effacer un taple dans une liste (Python)
Comment incorporer des variables dans des chaînes python
J'ai essayé de créer une méthode de super résolution / SRCNN ①
J'ai essayé de jouer à un jeu de frappe avec Python
J'ai essayé la méthode des moindres carrés en Python
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé d'implémenter TOPIC MODEL en Python
Comment notifier les canaux Discord en Python
Comment obtenir les fichiers dans le dossier [Python]
J'ai essayé d'ajouter un module Python 3 en C
J'ai essayé de créer une méthode de super résolution / SRCNN ③
[Python] Comment dessiner un histogramme avec Matplotlib
J'ai essayé de créer une méthode de super résolution / SRCNN ②
J'ai essayé d'implémenter le tri sélectif en python
Comment obtenir la valeur du magasin de paramètres dans lambda (en utilisant python)
J'ai essayé de développer un formateur qui génère des journaux Python en JSON
J'ai essayé d'implémenter le jeu de cartes de Trump en Python
Comment développer en Python
J'ai essayé de représenter graphiquement les packages installés en Python
Comment convertir / restaurer une chaîne avec [] en python
Je souhaite intégrer une variable dans une chaîne Python
Comment obtenir le nom de la variable lui-même en python
Je veux facilement implémenter le délai d'expiration en python
Comment obtenir le nombre de chiffres en Python
J'ai essayé de résumer comment utiliser matplotlib de python
J'ai essayé de démarrer avec le script python de blender_Part 01
Je veux écrire en Python! (2) Écrivons un test
[Python] Comment développer des variables dans une chaîne de caractères
J'ai essayé de démarrer avec le script python de blender_Partie 02
Je veux échantillonner au hasard un fichier avec Python
J'ai essayé d'implémenter le poker de Drakue en Python
Je veux travailler avec un robot en python.
J'ai essayé d'implémenter GA (algorithme génétique) en Python
[Python] Création d'une méthode pour convertir la base en 1 seconde
Comment exécuter une commande à l'aide d'un sous-processus en Python
[Python] J'ai essayé d'obtenir Json de squid ring 2
J'ai essayé de créer une classe qui peut facilement sérialiser Json en Python
[Python] J'ai essayé d'obtenir le nom du type sous forme de chaîne de caractères à partir de la fonction type
J'ai essayé d'implémenter ce qui semble être un outil de snipper Windows avec Python