Ich möchte einen praktischen Dekorator haben, der überprüft, ob der Wert des an die Methode übergebenen Attributs nicht None ist. Ich möchte es dann als Allzweckdekorator in Klassenmethoden verwenden. Dazu schrieb ich:Wrapping eines Konstruktors in Decorator in Python
def check_empty(name):
def wrap_outer(function):
def wrapped(*args, **kwargs):
if kwargs.get(name, None) is None:
raise Exception('{item} cannot be empty'.format(item=name))
return function(args, kwargs)
return wrapped
return wrap_outer
Und die Klasse wie folgt definiert:
class Player(object):
@check_empty('name')
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
Allerdings bedeutet dies nicht funktionieren. Die Vorlage für den Konstruktor und den Dekorator stimmen nicht überein. Wie können wir einen Funktionsdecorator für einen Konstruktor erstellen? Oder ist der klassenbasierte Dekorateur eine bessere Option?
Dank @ ajax1234, habe ich das Problem herausgefunden. Es war in der Art, wie ich meine args
und kwargs
übergeben wurde. Es hätte sein müssen:
def check_empty(attr):
def wrap_outer(function):
def wrapped(*args, **kwargs):
if (len(args) > 1 and args[1] is None) or (len(args)==1 and len(kwargs)==0):
raise Exception('{item} cannot be empty'.format(item=attr))
elif attr in kwargs and kwargs.get(attr, None) is None:
raise Exception('{item} cannot be empty'.format(item=attr))
return function(*args, **kwargs)
return wrapped
return wrap_outer
Diese kümmert sich auf den Parameter zu überprüfen, ob es als Schlüsselwort Argument oder nur ein Positions Argument übergeben wird.
HINWEIS: Es hat eine Einschränkung, dass Positionslogik wird nicht gut skalieren, während die allgemeine Natur beibehalten. (Wir bräuchten in das Positions Argumente der Position suchen inspect.getargspec
und anschließend von dort aufzubauen.)
Hallo, was ich versuche, ist ein allgemeiner Dekorateur, der einen beliebigen Variablennamen überprüfen kann. Zum Beispiel, wenn ich mit 'name' auch eine' age' Variable habe, würde ich gerne den gleichen Dekorateur zweimal benutzen. – Anshul
@Anshul bitte meine letzten Bearbeitung. – Ajax1234
Danke! Dies funktioniert für das gegebene Szenario.Auch wenn ich mich fragte, warum deine 'cls' funktionierten und' argc', habe ich auch meinen Fehler herausgefunden. Ich habe 'args' und 'kwargs' in 'return function (args, kwargs)' übergeben, wenn ich '* args' und' ** kwargs' als 'return function (* args, ** kwargs)' – Anshul