抱歉,这是一个非常广泛的问题.

下面的代码是在网络上找到的东西的一个片段.我感兴趣的关键是以@protected开头的行——我想知道这是什么,它是如何做到的?它似乎是在执行do_upload_ajax函数之前判断是否有有效用户登录.这看起来是进行用户身份验证的一种非常有效的方法.不过,我不理解这个@function的机制——有人能指导我朝着正确的方向解释一下它在现实世界中是如何实现的吗?请回答Python 3.谢谢

@bottle.route('/ajaxupload', method='POST')
@protected(check_valid_user) 
def do_upload_ajax():
    data = bottle.request.files.get('data')
    if data.file:
        size = 0

推荐答案

看看这个enormous answer/novel.这是我见过的最好的解释之一.

我能给出的最简短的解释是,装饰程序将您的函数包装在另一个返回函数的函数中.

例如,以下代码:

@decorate
def foo(a):
  print a

如果删除decorator语法,则相当于此代码:

def bar(a):
  print a

foo = decorate(bar)

decorator 有时会获取参数,这些参数被传递给动态生成的函数,以改变它们的输出.

正如装饰师所说,这是另一个概念.

Python-3.x相关问答推荐

为什么打印语句在Python多处理脚本中执行两次?

如何转换Pandas中的数据,以使我 Select 的列名变为行值并增加行?

切片时是否在NumPy ND数组中创建新对象?

如何使用魔杖扭曲图像

如何计算累积几何平均数?

从列表的元素和python中的多个多索引数据帧执行方程

避免重复连续字符但不包括一个特定字符的正则表达式

用于 BIG 数组计算的多处理池映射比预期的要慢

Pytorch:图像标签

参数化泛型不能与类或实例判断一起使用

如何通过python打开文件

pip install dryscrape 失败并显示错误:[Errno 2] 没有这样的文件或目录:'src/webkit_server'?

通过多个键对字典列表进行分组和聚合

Python 的 unittest 和 unittest2 模块有什么区别?

matplotlib - 模块sip没有属性setapi

如何强制 Sphinx 使用 Python 3.x 解释器

为什么变量 = 对象不像变量 = 数字那样工作

finally 总是在 try 块返回之前运行,那么为什么 finally 块中的更新不会影响 try 块返回的变量的值呢?

为什么异步库比这个 I/O 绑定操作的线程慢?

如何将python日志(log)级别名称转换为整数代码