Ich möchte einen Dekorateur erstellen einen Logger zu jeder eingerichteten Klasse hinzufügen. Es gelang mir, mit:Decorator nimmt eine Klasse und verschiedene Parameter in der Eingabe
def logged(cls_to_decorate):
log_name = cls_to_decorate.__module__
logger = logging.getLogger(log_name)
setattr(cls_to_decorate, 'logger', logger)
return cls_to_decorate
Seine Nutzung:
@logged
class TestFoo(TestCase):
def test_foo_function(self):
self.logger.debug("ciao!!")
Nun nehmen wir an, ich diesem Dekorateur ein zusätzlicher Parameter übergeben werden soll, so dass es wie folgt verwenden:
@logged(logging_level=logging.DEBUG)
class TestFoo(TestCase):
pass
I habe versucht, die Syntax der Decorators für Funktionen/Methoden (mit Wrapped-Funktion) zu verwenden, aber natürlich, da wir über eine Klasse als Parameter sprechen, funktioniert es nicht.
Der Dekorateur sollte wie folgt sein:
...
def logged(cls_to_decorate, logging_level=None):
logging.basicConfig(level=logging_level)
log_name = cls_to_decorate.__module__
logger = logging.getLogger(log_name)
setattr(cls_to_decorate, 'logger', logger)
return cls_to_decorate
...
HINWEIS: das Objekt eingerichtet werden soll, eine Klasse und keine Funktion.
Lösung python decorators with parameters gelten soll, aber ich versuchte, die folgenden:
def logged(logging_level=None):
def class_decorator(cls_to_decorate):
# Do something with arguments
logging.basicConfig(level=logging_level)
log_name = cls_to_decorate.__module__
logger = logging.getLogger(log_name)
setattr(cls_to_decorate, 'logger', logger)
return cls_to_decorate
return class_decorator
Aber ich habe einen Fehler jedes Mal, wenn ich takling einige Argument eine Klasse wickeln:
E TypeError: class_decorator() takes exactly 1 argument (2 given)
Vielen Dank für Ihre Hilfe!
Nein, da die Antwort über einen Funktionsdekorator ist ... –
gilt genau das gleiche Prinzip! –