[PYTHON] Décorer avec un décorateur

Décorateur

Un décorateur revient à ajouter un comportement supplémentaire à une fonction existante. Par exemple, vous pouvez mesurer le temps d'exécution et le sortir, ou ajouter un message tel que "~ ~ fonction a été exécutée".

échantillon

Cette fois, j'ai fait quelque chose pour ajouter un message à la mesure du temps de sortie et d'exécution Code créé: https://github.com/KodairaTomonori/Qiita/tree/master/default_module/syntax

Ajouter un message

decoration.py


deco =  '¡+゜+¡・゜・¡+*+¡・★・¡+*+¡・===[ '
deco_end = deco.replace('[', ']')[::-1]
deco_result = [' ∧____∧ Résultats', '( `Д´ )Je sortirai', '(▄︻▇〓┳0035', '/   )', '( / ̄∪']

def deco_func(func):
    def decoration(*args, **kwargs):
        print(deco + 'start   ' + func.__name__ + deco_end)
        for i in range(len(deco_result) ):
            if i != 2: print(deco_result[i])
            else: print(deco_result[i], func(*args, **kwargs) )
        print(deco + 'end     ' + func.__name__ + deco_end)
    return decoration

@deco_func
def addition(a, b):
    return '{} + {} = {}'.format(a, b, a + b)

if __name__ == '__main__':
    addition(103842, 283746)

production

Capture d'écran 2015-10-27 2.02.23.png

Le décorateur est que la fonction deco_func renvoie la fonction décoration créée dans la fonction. decoration imprime le début et la fin pour décorer la sortie. Vous pouvez obtenir le nom de la fonction avec func .__ name__. De plus, en définissant (* args, ** kwargs), il est possible de correspondre à la plupart des fonctions.

Pour l'utiliser comme décorateur, ajoutez simplement @ deco_func devant la fonction. En faisant cela, ʻaddition=deco_func (addition) (a, b)`.

mesure du temps

timer.py


#usr/bin/python

import time

def timer(func):
    def print_time(*args, **kwargs):
        start = time.time()
        func(*args, **kwargs)
        print(func.__name__ + \
            'Le temps qu'il a fallu pour s'exécuter{}Secondes'.format(time.time() - start) )
    return print_time

@timer
def roop_timer(a):
    return roop(a)

def roop(a):
    sum_ = 0
    for i in range(a):
        sum_ += i
    return sum_

if __name__ == '__main__':
    roop_timer(10000)
    timer(roop)(10000)

production

output.txt


roop_Il a fallu 0 temps pour exécuter le minuteur.0008311271667480469 secondes
Il a fallu 0 temps pour exécuter roop.0008249282836914062 secondes

print_time mesure le temps et affiche le résultat. func .__ name__ récupérera le nom de la fonction. Si vous voulez refléter @ timer uniquement dans une partie, vous pouvez faire la même opération en réglant timer (roop) (10000). Il est également possible de créer une fonction qui lui est dédiée, telle que roop_timer (il est plus facile de créer cela en utilisant deux ou plus).

Résumé

Vous pouvez facilement ajouter d'autres fonctions à une fonction en ajoutant @ decorate_function.

Recommended Posts

Décorer avec un décorateur
Créez facilement un profil avec un décorateur
Format A4 avec python-pptx
Faire un décorateur de fonction
Utilisez Property Decorator?
Apprenez librosa avec un tutoriel 1
Dessinez un graphique avec NetworkX
Essayez de programmer avec un shell!
Créer une page d'accueil avec django
Utiliser une imprimante avec Debian 10
Faites une loterie avec Python
Créer un répertoire avec python
Un peu coincé dans le chainer
Dessinez un graphique avec networkx
Faire un feu avec kdeplot
Créer un environnement Kubernetes avec Ansible 2
[Python] Qu'est-ce qu'une instruction with?
Résoudre ABC163 A ~ C avec Python
Faites fonctionner l'imprimante de reçus avec python
Manuel de graphisme Python avec Matplotlib.
Jouez avec une tortue avec des graphiques de tortue (partie 1)
Tracez un graphe avec Julia + PyQtGraph (2)
Décorateur 1
Générer une distribution normale avec SciPy
Créer un arbre déterminé avec scikit-learn
Faisons une interface graphique avec python.
Faites un son avec le notebook Jupyter
Apprenez avec FizzBuzz Iterator, Generator, Decorator
Énumérer les fichiers avec des extensions spécifiques
Créer un serveur Flask avec Docker
Créer un fichier deb avec Docker
Résoudre ABC166 A ~ D avec Python
Dessinez un graphique lâche avec matplotlib
Déployer l'application Django avec Docker
Faisons une rupture de bloc avec wxPython
Créez un environnement virtuel avec Python!
J'ai fait une loterie avec Python.
Dessinez un beau cercle avec numpy
Django Tips-Créez un site de classement avec Django-
Tracez un graphique avec Julia + PyQtGraph (1)
Créer un environnement virtuel avec Python 3
Dessinez un graphique avec Julia + PyQtGraph (3)
Résoudre ABC168 A ~ C avec Python
Créer un système de recommandation avec python
Décorateur 2
Créer une application Web avec Django
Générer une URL pré-signée avec golang
[Python] Générer un mot de passe avec Slackbot
Résoudre ABC162 A ~ C avec Python
Créer un framework de décorateur à usage général pour Python
Dessinez un graphique avec des pandas + XlsxWriter
Créer un filtre avec un modèle django
Résoudre ABC167 A ~ C avec Python
Faisons un graphe avec python! !!
Faisons un spacon avec xCAT
Créez un stepper de poisson avec numpy.random
Faire un joli graphique avec plotly
Créer un environnement Kubernetes avec Ansible 1
Dessinez un graphique avec l'interface graphique PySimple