大家好!
本文的翻译是为“ 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()
功能范围作为变量
Python中的作用域规则说,创建变量时,始终会创建一个新的局部变量,但是当它在所有最接近的匹配区域中搜索变量名时,将在局部作用域中确定对该变量的访问。 这并不意味着我们无法从函数中访问全局变量。 要输出全局变量,我们将函数foo更改如下:
>>> >>> a_string = "This is a global variable" >>> >>> def foo(): ... print(a_string)
可变寿命
变量不仅存在于名称空间中,而且具有生存期,这一点要记住。 考虑一个示例,该示例不仅说明范围规则及其可能引起的问题,而且还说明它们如何与函数调用交互以及如何在Python和其他语言中工作。
>>> def foo(): ... x = 1 ... >>> foo() >>> >>> print(x)
嵌套函数
在Python中,您可以创建嵌套函数,这意味着我们可以在函数中声明函数,并且所有作用域和生存期规则仍然适用。
>>> >>> def outer(): ... x = 1 ... def inner(): ... print(x)
装饰工
将函数作为参数并返回函数的闭包称为装饰器。 考虑一个有用的装饰器的例子。
>>> >>> def outer(some_func): ... def inner(): ... print("before some_func") ... ret = some_func()
装饰变量是foo的装饰版本。 实际上,我们可以将foo替换为其修饰版本,而不必通过简单地重新分配包含我们函数的变量来学习新语法:
>>> >>> foo = outer(foo) >>> >>> foo
现在,我们有了一个漂亮的装饰器来跟踪函数调用。 装饰器可用于使用Python与任何编程语言一起使用。 这是一个非常有用的工具,必须正确理解其工作机制才能正确应用它们。