抱歉,这是一个非常广泛的问题。
下面的代码是在网上找到的东西的片段。我感兴趣的关键是@protected开头的一行——我想知道这是做什么的,它是如何做到的?在执行do_upload_ajax函数之前,它似乎正在检查有效用户是否登录。这看起来是一种非常有效的用户身份验证方法。不过,我不明白这个@函数的机制——有人能告诉我正确的方向,解释一下这将如何在现实世界中实现吗?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
decorator语法:
@protected(check_valid_user)
def do_upload_ajax():
"..."
相当于
def do_upload_ajax():
"..."
do_upload_ajax = protected(check_valid_user)(do_upload_ajax)
但不需要重复同一个名字三次。没有别的了。
例如,下面是一个可能的实现protected()
:
import functools
def protected(check):
def decorator(func): # it is called with a function to be decorated
@functools.wraps(func) # preserve original name, docstring, etc
def wrapper(*args, **kwargs):
check(bottle.request) # raise an exception if the check fails
return func(*args, **kwargs) # call the original function
return wrapper # this will be assigned to the decorated name
return decorator
decorator是一个函数,它将函数作为其唯一参数并返回函数。这有助于反复使用相同的代码“包装”功能。
我们使用@func_name指定要应用于另一个函数的装饰器。
下面的示例将欢迎消息添加到fun()返回的字符串中。将fun()作为参数并返回welcome()。
def decorate_message(fun):
# Nested function
def addWelcome(site_name):
return "Welcome to " + fun(site_name)
# Decorator returns a function
return addWelcome
@decorate_message
def site(site_name):
return site_name;
print site("StackOverflow")
Out[0]: "Welcome to StackOverflow"
装饰器在将数据(或添加属性)附加到函数时也很有用。
将数据附加到func的装饰函数
def attach_data(func):
func.data = 3
return func
@attach_data
def add (x, y):
return x + y
print(add(2, 3))
# 5
print(add.data)
# 3
好好看看这个巨大的答案/小说。这是我遇到的最好的解释之一。
我能给出的最简短的解释是,修饰符将您的函数包装在另一个返回函数的函数中。
这个代码,例如:
@decorate
def foo(a):
print a
如果删除decorator语法,则与此代码等效:
def bar(a):
print a
foo = decorate(bar)
装饰器有时需要参数,这些参数被传递给动态生成的函数来改变它们的输出。
你应该阅读的另一个术语是封闭,因为这是允许装饰者工作的概念。
问题内容: 抱歉,这是一个非常广泛的问题。 以下代码是网络上某些内容的片段。我感兴趣的关键是从@protected开始的行- 我想知道这是做什么的以及它是如何做到的?在执行do_upload_ajax函数之前,似乎正在检查是否已登录有效用户。这似乎是进行用户身份验证的一种非常有效的方法。我不了解此@函数的机制- 有人可以引导我正确的方向来解释如何在现实世界中实现它吗?Python 3请回答。谢谢。
我想写一个brainfuck口译员,但我错过了一些上下文或其他东西。应该被调用以处理“
我是Hibernate和JPA的新手,我对这个注释有问题。有人能简单地解释一下这个注释到底在做什么吗?因为在这种情况下,文档对我来说很难理解。 编辑我明白什么是持久上下文,但在代码中,我有这样的例子: 我对@PerustenceContext做什么有问题。抱歉,也许我没有具体说明。
问题内容: 这是python装饰器的示例。我无法理解它的工作方式。请向我解释给定示例的控制流程。我将非常有义务。 问题答案: 装饰器是在Python中应用高阶函数的语法糖。高阶函数是将一个或多个函数作为输入并返回一个函数的函数。即 这里是一个高阶函数,它接受单个参数的函数,并返回单个参数的函数。您可以将其视为修改的行为。 高阶函数是可组合的(根据定义),因此在您的特定示例中,装饰器语法, 等价于
我不知道“?”和“:”的用法。