【问题标题】:*args and **kwargs Python*args 和 **kwargs Python
【发布时间】:2020-09-16 08:25:56
【问题描述】:

我正在做一个练习,我试图解决它,但没有结果,我不得不查看解决方案,以便有一个想法并重复它,这个问题,我卡住了,有点迷茫。

# 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,所以我可以通过仅调用 [valid] 来检查值是否为 True: 它来自args[0]

帮助,我真的被这个困住了..

【问题讨论】:

标签: python args keyword-argument


【解决方案1】:

@authenticated 装饰器执行以下操作:

  1. 确保调用函数时至少使用一个位置参数(否则会引发异常)。
  2. 确保第一个参数是字典,或者至少支持通过字符串下标访问项目(同样,否则会引发异常)。
  3. 确保在字典中找到键 'valid'(否则,例外)。
  4. 如果键存在于字典中并且具有 True 布尔值,则调用原始函数并由修饰函数返回其返回值。否则,不会调用任何函数,也不会返回任何值。

这不是一种非常简洁的函数装饰方式,但如果你能确保条件 1 到 3 始终成立,那么条件 4 在某些情况下可能会很有用。

【讨论】:

    【解决方案2】:

    装饰器可以写的更清楚一点,不用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 是按位置传递还是作为关键字参数传递,它都有效。

    【讨论】:

    • 所以通过写这个 args[0] 我是说我有 0 个 args 所以程序会尝试在 **kwargs 中查找?
    • @Zeentanas 不,args 是传递给函数的所有位置参数的元组(除了那些已经绑定到其他参数的参数,例如 user 在这种情况下),并且 args[0] 是第一个一。
    【解决方案3】:

    如果您将 user1 作为 keyword-argument 传递,则可以使用 kwargs。例如,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}
    

    【讨论】:

      猜你喜欢
      • 2017-01-28
      • 1970-01-01
      • 2018-08-28
      • 2023-03-19
      • 2021-07-26
      • 2022-09-22
      • 2010-10-24
      • 2023-04-01
      • 2013-08-04
      相关资源
      最近更新 更多