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.
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
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
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
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"
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