Erstellen Sie in Python einen Dekorator, der Argumente dynamisch akzeptiert. Erstellen Sie einen Dekorator

Hintergrund

Wenn Sie Ihren eigenen Dekorator in Python definieren und verwenden, möchten Sie möglicherweise später Argumente an den Dekorator übergeben können.

Ursprünglicher Verwendungsort des Dekorateurs


@my_decorator
def hoge():
	# ...

Wenn Sie einen allgemeinen Dekorateur implementieren und später Argumente an den Dekorateur übergeben möchten, Es wird notwendig sein, alle Dekorateure, die wie ↑ als ↓ verwendet wurden, neu zu schreiben.

Beim Setzen von Argumenten bei Verwendung eines Dekorators


@my_decorator(arg1='value1')
def hoge():
	# ...

Auch wenn Sie keine Argumente benötigen, müssen Sie Klammern setzen, wenn sich die Decorator-Implementierung ändert.

Wenn bei Verwendung des Dekorators kein Argument festgelegt ist


@my_decorator()
def hoge():
	# ...

Das Umschreiben aller Teile, die den Dekorator verwenden, ist mühsam zu ändern und zu überprüfen. Daher wollte ich, dass es ohne Klammern funktioniert, wenn keine Argumente benötigt werden.

Zweck

Ich möchte einen Dekorator (my_decorator) erstellen, der die unten gezeigten Argumente dynamisch verwenden kann. Übrigens möchte ich es als Dekorateur für Dekorateure implementieren, damit solche Funktionen universell genutzt werden können.

python


#Ohne Argumente
@my_decorator
def hoge():
	pass

#Mit Argument
@my_decorator(arg1='value1')
def fuga():
	pass

Implementierung

Implementieren Sie einen Dekorator, der die auf den Dekorator anzuwendenden Argumente dynamisch interpretiert, wie unten gezeigt.

decorators.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import functools


def dynamic_args(func0):
    def wrapper(*args, **kwargs):
        if len(args) != 0 and callable(args[0]):
            #Wenn eine Funktion als erstes Argument übergeben wird:Behandle als Dekorateur ohne Argumente
            func = args[0]
            return functools.wraps(func)(func0(func))
        else:
            #Andere:Behandle als Dekorateur mit Argumenten
            def _wrapper(func):
                return functools.wraps(func)(func0(func, *args, **kwargs))
            return _wrapper
    return wrapper

Nutzungsbild

Wenn Sie einen Dekorateur wie den oben genannten vorbereiten, können Sie Ihren Zweck einfach erreichen, indem Sie Ihren eigenen Dekorateur wie folgt definieren.

python


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from decorators import dynamic_args


#Wenden Sie den oben erstellten Dekorateur auf Ihren eigenen Dekorateur an
@dynamic_args
def my_decorator(func, arg1='default_value1', arg2='default_value2'):
    def wrapper(*args, **kwargs):
    	#Definierte Argumente(arg1, arg2)Schreiben Sie den Prozess, den Sie tatsächlich verwenden möchten
    	# ...
    return wrapper

Verwendungsbeispiel

Erstellen Sie als Beispiel einen Dekorator mit Klammern vor und nach dem Rückgabewert (Zeichenfolge) mit dem Namen "my_decorator".

sample.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from decorators import dynamic_args


#####################
#Eigene Dekorateur Definition#
#####################
@dynamic_args
def my_decorator(func, before='「', after='」'):
    def wrapper(*args, **kwargs):
        return "{} {} {}".format(before, func(*args, **kwargs), after)
    return wrapper


##########################
#Beispiel für die Verwendung eines Dekorators ohne Argument#
##########################
@my_decorator
def func_without_args():
    return "Argumentloser Dekorateur"

print(func_without_args()) # output:"Dekorateur ohne Argumente"


##########################
#Beispiel für die Verwendung eines Dekorateurs mit Argumenten#
##########################
@my_decorator(before='『', after='』')
def func_with_args():
    return "Dekorateur mit Argumenten"

print(func_with_args()) # output:"Dekorateur mit Argumenten"


####################################
#Beispiel für die Anwendung eines Dekorators auf eine vordefinierte Funktion#
####################################
def func_without_decorator():
    return "Kein Dekorateur"


print(my_decorator(func_without_decorator)()) # output:"Kein Dekorateur"
print(my_decorator(before="『", after="』")(func_without_decorator)()) # output:"Kein Dekorateur"

Referenz

Python-Tipps: Ich möchte Argumente an den Dekorateur übergeben - Leben mit Python http://www.lifewithpython.com/2016/09/python-decorator-with-arguments.html

Python-Dekoratorausdruck (2) - Wenn ein Dekorator ein Argument hat und Sie mehrere Dekoratoren anwenden | Vergessen Sie sofort das Gehirn. Ein Hinweis dafür http://jutememo.blogspot.jp/2008/10/python-2.html

python - AttributeError: 'str' object has no attribute 'module' - Stack Overflow http://stackoverflow.com/questions/18493879/attributeerror-str-object-has-no-attribute-module

Recommended Posts

Erstellen Sie in Python einen Dekorator, der Argumente dynamisch akzeptiert. Erstellen Sie einen Dekorator
Erstellen Sie eine Funktion in Python
Erstellen Sie ein Wörterbuch in Python
Erstellen Sie eine gefälschte Klasse, die auch betrügt, ist Instanz
Erstellen Sie in Python einen Dekorator, der Argumente dynamisch akzeptiert. Erstellen Sie einen Dekorator
Erstellen Sie einen DI-Container mit Python
Erstellen Sie eine Binärdatei in Python
Erstellen Sie ein universelles Dekorationsframework für Python
Erstellen Sie eine zufällige Zeichenfolge in Python
Geben Sie einem Python-Dekorateur einen Alias, der ein festes Argument übergibt
Erstellen wir ein Skript, das sich bei Ideone.com in Python registriert.
Erstellen Sie den Code, der in Python "A und vorgeben B" ausgibt
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
[Python] Erstellen Sie einen LineBot, der regelmäßig ausgeführt wird
[GPS] Erstellen Sie eine kml-Datei mit Python
Erstellen wir eine Kundendatenbank, in der QR-Code automatisch in Python ausgegeben wird
Erstellen Sie in 1 Minute eine Vim + Python-Testumgebung
Erstellen Sie eine GIF-Datei mit Pillow in Python
Ich möchte mit Python ein Fenster erstellen
Erstellen Sie in Python ein Diagramm der Standardnormalverteilung
So erstellen Sie eine JSON-Datei in Python
Erstellen Sie eine virtuelle Umgebung mit conda in Python
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
Erstellen Sie in Python ein einfaches Momentum-Investmentmodell
Python: Erstellen Sie eine Klasse, die entpackte Zuweisungen unterstützt
Erstellen Sie eine neue Seite im Zusammenfluss mit Python
Erstellen Sie ein Datum / Uhrzeit-Objekt aus einer Zeichenfolge in Python (Python 3.3).
Erstellen Sie in Python ein Paket mit globalen Befehlen
Erstellen Sie eine MIDI-Datei in Python mit pretty_midi
Erstellen Sie in KiCad ein Rahmenantennenmuster in Python
[Docker] Erstellen Sie in 3 Minuten eine jupyterLab (Python) -Umgebung!
Erstellen Sie Spatia Lite in Python
Erstellen Sie eine Python-Umgebung
Ich habe versucht, eine Klasse zu erstellen, mit der Json in Python problemlos serialisiert werden kann
Erstellen Sie ein Plugin, mit dem Sie in Python nach Registerkarten für Sublime Text 3 suchen können
Ich möchte eine Prioritätswarteschlange erstellen, die mit Python (2.7) aktualisiert werden kann.
Erstellen Sie mit Selenium einen Datenerfassungsbot in Python
[LINE Messaging API] Erstellen Sie mit Python ein umfangreiches Menü
Erstellen Sie ein Plug-In, das Python Doctest auf Vim ausführt (2)
Erstellen Sie ein Plug-In, um Python Doctest mit Vim (1) auszuführen.
Was ist in dieser Variablen (wenn das Python-Skript ausgeführt wird)?
Erstellen Sie mit Quarry einen gefälschten Minecraft-Server in Python
MALSS (Einführung), ein Tool, das maschinelles Lernen in Python unterstützt
Machen Sie einen Screenshot in Python
Erstellen Sie ein Wox-Plugin (Python)
Importieren Sie Skripte dynamisch in Python
Erstellen Sie ein Lesezeichen in Python
Erstellen Sie ein Python-Numpy-Array
Rufen Sie Methoden in Python dynamisch auf
Zeichne ein Herz in Python
Erstellen Sie ein Verzeichnis mit Python
Ein Allzweckprogramm, das Linux-Befehlszeichenfolgen mit Python formatiert
Erstellen Sie einen lokalen Bereich in Python, ohne den Namespace zu verschmutzen
Eine Funktion, die iterable in Python in N Teile unterteilt
Veröffentlichung einer Bibliothek, die Zeichendaten in Python-Bildern verbirgt
Durchlaufen Sie einen Generator, der einen Datumsiterator in Python zurückgibt
[Python] Erstellen Sie einen Linebot, der ein beliebiges Datum auf ein Foto zeichnet
Erstellen Sie ein untergeordnetes Konto für die Verbindung mit Stripe in Python