je ne comprends pas pourquoi on fait ça args [0] ["valid"] au lieu de juste args ["valid"]
user1 = { 'name': 'Sorna', 'valid': True } def authenticated(fn): def wrapper(*args, **kwargs): if args[0]['valid']== True: #if args['valid']== True: return fn(*args, **kwargs) return wrapper @authenticated def message_friends(user): print('message has been sdent') message_friends(user1)
3 Réponses :
À première vue, authenticated
semble capable d' wrapper
n'importe quelle fonction, le wrapper
doit donc être défini pour accepter toute combinaison d'arguments possible: arguments de position multiples, arguments de mots clés arbitraires, etc.
Cependant, seul le premier argument positionnel args[0]
est intéressant pour décider si la fonction d'origine (liée à fn
) doit être appelée.
Implicite dans la conception est que authenticated
ne peut être appliqué en toute sécurité qu'à une fonction dont le premier argument de position est une valeur mappable avec 'valid'
comme clé.
*args
sont toujours passés en tant que tuple, vous devez donc utiliser un index pour accéder au contenu:
A () K {'name': 'Sorna', 'valid': True} message has been sent to Sorna
En dehors:
def authenticated(fn): def wrapper(*args, **kwargs): print('A', args) print('K', kwargs) if kwargs['valid']== True: return fn(*args, **kwargs) return wrapper @authenticated def message_friends(**user): print('message has been sent to %s' % user['name']) message_friends(**user1)
Sinon, vous pouvez passer user1
comme kwargs pour se débarrasser des indices:
A ({'name': 'Sorna', 'valid': True}, ) K {}
En dehors:
def authenticated(fn): def wrapper(*args, **kwargs): print('A', args) print('K', kwargs) if args[0]['valid']== True: return fn(*args, **kwargs) return wrapper
*args
capture tous les arguments non-mots-clés qui lui sont passés. En appelant message_friends(user1)
vous passez user1
comme seul argument (sans mot-clé), ce qui signifie que vous devez y accéder via *args
.
Lorsqu'une fonction ou une méthode a un paramètre de
*args
, il s'agit d'une liste d'arguments sans mot-clé. Donc, c'est une liste. Dans ce cas, c'est une liste d'un élément:user1
. Donc, pour accéder à cet argument, c'estargs[0]
.