装饰器
首先, 定义了一个装饰器:
def db_wrap(method):
@functools.wraps(method)
def _wrapper(*args, **kwargs):
# 数据库的连接
conn = Mysql().connection
cursor = conn.cursor()
try:
cursor.execute("BEGIN")
retval = method(cursor, *args, **kwargs)
cursor.execute("COMMIT")
except:
cursor.execute("ROLLBACK")
raise
finally:
cursor.close()
conn.close()
return retval
return _wrapper
然后去装饰了一个函数,函数是通过sql语句查某张表的数据,函数是这样的
@db_wrap
def get_data_by_index(cursor, exec_sql):
cursor.execute(exec_sql)
res = cursor.fetchall()
res = list(res) if res else []
return res
最后调用的时候,是这样的
sql = '''SELECT * FROM WFXX WHERE CLXXBH > %d AND CLXXBH <= %d ORDER BY CLXXBH''' get_data_by_index(sql)
我调用的时候只传了一个参数,但原函数是要接收两个参数的
函数体中的确有 cursor 和 exec_sql 两个参数,得到的结果也是正确的
问题如下:
1.装饰器改变了函数的传参,原本要传两个参数的,现在只需传一个了,装饰器赠送了 cursor 参数
2.装饰器的原理不是说在不影响原函数的情况下,增加额外逻辑,显然这个装饰器违反了规则
每天都要遇到更好的自己.

浙公网安备 33010602011771号