@是什么
@是一个语法糖, 语法糖的意思是一种简便写法 (就好像 a++ 是 a = a + 1 的简便写法), 以下两种表达方式完全等价
def foo(fn):
fn('hi')
# 写法一
@foo
def bar(something):
print(something)
# 写法二
def bar(something):
print(something)
bar = foo(bar)
所以@的作用是:
- 获得一个高级自定义函数
- 作为调用第三方函数的回调函数
下文对以上两点作解释.
理解
作为高级函数
以数据库场景为例, 我可以把数据库逻辑相关的函数提前写好
import pymysql
'''
将数据库相关的逻辑提前写好
'''
def get_rows(callback):
def _(*args):
db = pymysql.connect('localhost', 'root', 'root', 'some_db')
cursor = db.cursor()
cursor.execute(args[0])
rows = cursor.fetchall()
db.close()
return callback(rows=rows)
return _
'''
这里只需要写处理的逻辑
'''
@get_rows
def process_rows(sql=None, rows=None, fn = None):
for row in rows:
if fn is None:
print(row)
else:
fn(row)
if __name__ == '__main__':
process_rows(sql = 'select * from user')
作为回调函数
首先需要注意的是, @语法它相当于执行了
bar = foo(bar)
因此, 解释器在读到@命令以及其下方的函数定义之后, 会立即执行@的函数, 所以可以有如下用法:
def foo(callback):
# 开启一个线程, 定时调用 callback
# 以下语句无意义, 纯粹为了符合语法
def _():
pass
return _
@foo
def bar():
# do something...
pass
这种用法的特点是, 你只需要声明这个 bar 函数, @语句会自动执行这个 foo 函数.