【问题标题】:What does args[0]['valid'] mean here in decoratorargs[0]['valid'] 在装饰器中是什么意思
【发布时间】:2020-06-17 09:26:43
【问题描述】:

@authenticated 装饰器允许函数在 user1 的“有效”设置为 True 时运行:

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

def authenticated(fn):
    def wrapper(*args , **kwargs):
        if args[0]['valid']:
            fn(*args, **kwargs)
        else:
            print(f'You are not authenticated to send messages. Please make deposit of $5 to your account')
    return wrapper


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

message_friends(user1)

我很难理解为什么使用args[0]['valid']。当我使用args[1]['valid] 时出现错误, 我知道我错过了一些关键概念。请帮帮我

【问题讨论】:

  • *args 是由您的函数调用提供的,在这种情况下它只有user1,没有args[1]
  • 是的,user1 是 args[0](函数的第一个唯一参数)
  • args = (位置)参数列表,args[0] = 第一个参数...

标签: python dictionary decorator


【解决方案1】:

对于 def wrapper(*args , **kwargs) -> args 表示字典(user1),if 语句取字典(args[0]),然后取 key 'valid ' (args[0]['valid']),这样,如果键 'valid' 的内容为 False,则不会发送消息(else 语句),如果内容为 True,则将发送消息。

尝试如下更改有效密钥的内容:

user1 = {'name': 'Sorna','valid': True}

在这些情况下,消息将被发送。

【讨论】:

  • 非常感谢,我明白了
【解决方案2】:

我之前也遇到过这个问题,但我认为这应该是正确的答案: args 作为元组传递给函数。在这种情况下,元组只有一个项目(user1 字典)。

类似这样的: args = ({user1})

为了访问键 ['valid'],您需要首先表明您正在访问元组 [0] 中的第一项。

我稍微扩展了代码:添加了另一个用户并在身份验证器中创建了 for 循环,以检查整个 args 元组,以检查尽可能多的用户中的 ['valid']喜欢在消息功能中输入。只有当所有用户都将“有效”键设置为 True 时,它​​才会返回消息。如果元组 args 的任何项的键设置为 False,则包装函数在 if 语句中返回 None,不会到达 for 循环后要调用的函数

user1 = {'name': 'Sorna', 'valid': True}

user2 = {'name': 'Ivan', 'valid': True}

def authenticated(fn):
    def wrapper(*args, **kwargs):
        for i in range(len(args)):
            if not args[i]['valid']:
                return None
        return fn(*args, **kwargs)
    return wrapper



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

message_friends(user1, user2) 

【讨论】:

    猜你喜欢
    • 2013-01-12
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 2014-02-24
    • 2015-09-21
    • 2011-01-27
    • 2015-03-20
    • 2020-01-07
    相关资源
    最近更新 更多