* аргументы и ** kwargs Python - PullRequest
1 голос
/ 29 мая 2020

Я работаю над упражнением, я пытался решить его, но безрезультатно, мне пришлось посмотреть решение, чтобы иметь идею и повторить ее, проблема, я застрял, немного потерялся.

# Create an @authenticated decorator that only allows the function to run is user1 has 'valid' set to True:

 user1 = { 'name': 'Sorna',
           'valid': True }         #changing this will either run or not run the message_friends function.

Решение:

def authenticated(fn):
  def wrapper(*args, **kwargs):
    if args[0]['valid']:
      return fn(*args, **kwargs)
  return wrapper

@authenticated
def message_friends(user):
    print('message has been sent')

message_friends(user1)

Я действительно не понимаю эту часть:

if args[0]['valid']:

Мой вопрос: if user1 = dict, почему я не могу просто используйте **kwards, чтобы я мог просто проверить, истинно ли значение, вызвав only [valid]: откуда оно взято args[0]?

Справка, я действительно застрял с этим ..

Ответы [ 3 ]

0 голосов
/ 29 мая 2020

Декоратор можно написать немного яснее, чтобы не использовать args[0], это поможет вам понять?

def authenticated(fn):
    def wrapper(user, *args, **kwargs):
        if user['valid']:
            return fn(user, *args, **kwargs)

    return wrapper

@authenticated
def message_friends(user):
    print('message has been sent to', user['name'])

message_friends({'name': 'Sorna', 'valid': True})
message_friends({'name': 'Bob', 'valid': False})

Теперь *args, **kwargs существует только для передачи любых других аргументов декорированной функции может иметь.

Это также более надежно, потому что оно работает независимо от того, передается ли user позиционно или как аргумент ключевого слова.

0 голосов
/ 29 мая 2020

Декоратор @authenticated выполняет следующие действия:

  1. Убедитесь, что функция вызывается по крайней мере с одним позиционным аргументом (иначе возникает исключение).
  2. Убедитесь, что этот первый аргумент является словарем или, по крайней мере, поддерживает доступ к элементу по строковым нижним индексам (опять же, иначе возникает исключение).
  3. Убедитесь, что ключ 'valid' найден в словаре (иначе, исключение).
  4. Если ключ существует в словаре и имеет логическое значение True , то вызывается исходная функция и ее возвращаемое значение возвращается декорированной функцией. В противном случае функция не вызывается и значение не возвращается. какой-то сценарий ios.
0 голосов
/ 29 мая 2020

Вы можете использовать kwargs, если вы передаете user1 как k eyword- arg ument. Например, message_friends(user_argument=user1) будет иметь args == [] и kwargs == {'user_argument': user1}

Дальнейшая иллюстрация этого пункта

def my_func(*args, **kwargs):
   print(f"Args: {args}")
   print(f"Kwargs: {kwargs}")

>> my_func(1, 2, 3, 4)
Args: [1, 2, 3, 4]
Kwargs: {}

>> my_func(1, 2, three=3, four=4)
Args: [1, 2]
Kwargs: {"three": 3, "four": 4}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...