1
votes

Comment utilisons-nous * args et ** kwargs avec les décorateurs

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)


1 commentaires

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'est args[0] .


3 Réponses :


0
votes

À 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é.


0 commentaires

1
votes

*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


0 commentaires

0
votes

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


0 commentaires