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