关于Python中的装饰器

大家好!


本文的翻译是为“ Python的Web开发人员”课程的学生准备的。 朝这个方向发展是否有趣? 报名参加“开放日”课程,并与老师聊天:7月23日在莫斯科时间20:00 在线广播



在Python中练习编程时,必须遇到装饰器之类的概念。 它们是现代库和框架中最优雅,最常用的工具之一。 装饰器是封装许多实现细节的好方法,在表面上保留了一个简单的接口。


让我们看一个简单的登录修饰符的示例,该修饰符会在用户有机会编辑帖子之前检查用户是否已登录。 然后,装饰器将重定向到登录或注册页面,然后在正确设置参数的帮助下,成功进行身份验证后,将返回到同一页面。 要使用此功能,只需在目标函数之前编写@login_required。


@login_required def edit_post(post_id): ... 

装饰器非常易于使用,但是即使对于有经验的Python程序员来说,创建装饰器也不是一件容易的事。 在本文中,我们将逐步研究装饰器在Python中的工作方式。


功能介绍


函数在Python 也称为一流对象。 函数与数字,列表和字符串具有相同的值,如以下示例所示。


 >>> def foo(): ... return 1 ... >>> >>> foo() 1 >>> 

函数具有自己的名称空间,它们在函数体内出现时首先在其中搜索变量名。 让我们编写一个简单的函数来了解全局范围和局部范围之间的区别。


 >>> >>> a_string = "This is a global variable" >>> >>> def foo(): ... print(locals()) ... >>> >>> print(globals()) {..., 'a_string': 'This is a global variable'} >>> >>> foo() # 2 {} >>> 

功能范围作为变量


Python中的作用域规则说,创建变量时,始终会创建一个新的局部变量,但是当它在所有最接近的匹配区域中搜索变量名时,将在局部作用域中确定对该变量的访问。 这并不意味着我们无法从函数中访问全局变量。 要输出全局变量,我们将函数foo更改如下:


 >>> >>> a_string = "This is a global variable" >>> >>> def foo(): ... print(a_string) #1 ... >>> >>> foo() This is a global variable >>> 

可变寿命


变量不仅存在于名称空间中,而且具有生存期,这一点要记住。 考虑一个示例,该示例不仅说明范围规则及其可能引起的问题,而且还说明它们如何与函数调用交互以及如何在Python和其他语言中工作。


 >>> def foo(): ... x = 1 ... >>> foo() >>> >>> print(x) # 1 Traceback (most recent call last): ... NameError: name 'x' is not defined >>> 

嵌套函数


在Python中,您可以创建嵌套函数,这意味着我们可以在函数中声明函数,并且所有作用域和生存期规则仍然适用。


 >>> >>> def outer(): ... x = 1 ... def inner(): ... print(x) # 1 ... inner() # 2 ... >>> outer() 1 >>> 

装饰工


将函数作为参数并返回函数的闭包称为装饰器。 考虑一个有用的装饰器的例子。


 >>> >>> def outer(some_func): ... def inner(): ... print("before some_func") ... ret = some_func() # 1 ... return ret + 1 ... return inner ... >>> def foo(): ... return 1 ... >>> decorated = outer(foo) # 2 >>> >>> decorated() before some_func 2 >>> 

装饰变量是foo的装饰版本。 实际上,我们可以将foo替换为其修饰版本,而不必通过简单地重新分配包含我们函数的变量来学习新语法:


 >>> >>> foo = outer(foo) >>> >>> foo # doctest: +ELLIPSIS <function outer.<locals>.inner at 0x...> >>> 

现在,我们有了一个漂亮的装饰器来跟踪函数调用。 装饰器可用于使用Python与任何编程语言一起使用。 这是一个非常有用的工具,必须正确理解其工作机制才能正确应用它们。

Source: https://habr.com/ru/post/zh-CN460931/


All Articles