Ich habe versucht "Wie man eine Methode in Python dekoriert"

Originalgeschichte: Wie man die Methode in Python dekoriert

Im ursprünglichen Blog habe ich das Modul * inspect * verwendet, aber es ist praktisch, das Modul * ast * zu verwenden.

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))

So was.

$ 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
--------------------------------

Nachtrag: Ich konnte den Quellcode des Moduls auch dynamisch mit * inspect.getsource * abrufen.

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))

Sie können den Quellcode des Objekts erhalten, das im Argument * inspect.getsource * übergeben wurde. Hier wird das Modul selbst übergeben, es können aber auch Klassen und Funktionen übergeben werden.

Recommended Posts

Ich habe versucht "Wie man eine Methode in Python dekoriert"
Wie bekomme ich Stacktrace in Python?
Ich habe versucht, einen Pseudo-Pachislot in Python zu implementieren
Ich habe versucht zusammenzufassen, wie man Pandas von Python benutzt
Ich habe versucht, einen eindimensionalen Zellautomaten in Python zu implementieren
Verwendung der Methode __call__ in der Python-Klasse
So erhalten Sie den letzten (letzten) Wert in einer Liste in Python
So erhalten Sie eine Liste der integrierten Ausnahmen für Python
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich habe versucht, PLSA in Python zu implementieren
Ich habe versucht, Permutation in Python zu implementieren
Ich habe versucht, PLSA in Python 2 zu implementieren
Ich habe versucht, ADALINE in Python zu implementieren
Ich habe versucht, PPO in Python zu implementieren
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
So erhalten Sie eine Zeichenfolge aus einem Befehlszeilenargument in Python
Ich habe versucht, ein missverstandenes Gefangenendilemma in Python zu implementieren
Ich habe versucht, eine Super-Resolution-Methode / ESPCN zu erstellen
So löschen Sie einen Taple in einer Liste (Python)
Einbetten von Variablen in Python-Strings
Ich habe versucht, eine Super-Resolution-Methode / SRCNN build zu erstellen
Ich habe versucht, mit Python ein Tippspiel zu spielen
Ich habe die Methode der kleinsten Quadrate in Python ausprobiert
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, TOPIC MODEL in Python zu implementieren
So benachrichtigen Sie Discord-Kanäle in Python
So erhalten Sie die Dateien im Ordner [Python]
Ich habe versucht, ein Python 3-Modul in C hinzuzufügen
Ich habe versucht, eine Super-Resolution-Methode / SRCNN build zu erstellen
[Python] Wie zeichnet man mit Matplotlib ein Histogramm?
Ich habe versucht, eine Super-Resolution-Methode / SRCNN build zu erstellen
Ich habe versucht, eine selektive Sortierung in Python zu implementieren
So erhalten Sie den Wert aus dem Parameterspeicher in Lambda (mit Python)
Ich habe versucht, einen Formatierer zu entwickeln, der Python-Protokolle in JSON ausgibt
Ich habe versucht, Trumps Kartenspiel in Python zu implementieren
Wie man in Python entwickelt
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
So konvertieren / wiederherstellen Sie einen String mit [] in Python
Ich möchte eine Variable in einen Python-String einbetten
So erhalten Sie den Variablennamen selbst in Python
Ich möchte Timeout einfach in Python implementieren
So ermitteln Sie die Anzahl der Stellen in Python
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
[Python] So erweitern Sie Variablen in einer Zeichenfolge
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Ich möchte eine Datei mit Python zufällig testen
Ich habe versucht, Drakues Poker in Python zu implementieren
Ich möchte mit einem Roboter in Python arbeiten.
Ich habe versucht, GA (genetischer Algorithmus) in Python zu implementieren
[Python] Erstellt eine Methode zum Konvertieren von Radix in 1 Sekunde
So führen Sie einen Befehl mit einem Unterprozess in Python aus
[Python] Ich habe versucht, Json von Tintenfischring 2 zu bekommen
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
[Python] Ich habe versucht, den Typnamen als Zeichenfolge aus der Typfunktion abzurufen
Ich habe versucht, ein scheinbar Windows-Snipper-Tool mit Python zu implementieren