Decorated function in Python always returns None(Python中的修饰函数始终返回NONE)
本文介绍了Python中的修饰函数始终返回NONE的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我对Python中的装饰符有一个奇怪的问题。基本上,我试图包装一个函数,这样它就可以为每个请求创建和删除游标(不要问--这只是一个示例,对于演示这个问题很有用!)我还有其他打算)。
这里有一个示例:
class DB(object):
"""Our DB methods and connections"""
def __init__(self):
self.con = oursql.connect(host=host, user=user, passwd=passwd,
port=port, db=db)
self.cursor = None
def __del__(self):
self.con.close()
def wrapper(func):
"""Wrapper for our database methods"""
def _exec(*args):
"""Wherein the wrapping takes place"""
db.cursor = db.con.cursor()
func(*args)
db.cursor.close()
return _exec
@wrapper
def get_tables(db):
"""Returns a list of all tables in the database"""
results = []
db.cursor.execute('show tables')
tables = db.cursor.fetchall()
for table in tables:
results.append(table[0])
print results
return results
if __name__ == '__main__':
db = DB()
print get_tables(db)
这是可行的,但我从包装函数得到的结果仅返回None:
[list of tables from "print results" goes in here]
None <- returned by the "print get_tables(db)" line
推荐答案
您忽略了包装函数的返回值:
db.cursor = db.con.cursor()
func(*args)
db.cursor.close()
在这里,您的函数以没有显式返回值结束,所以Python给您的是缺省值None。
您想要捕获返回值并返回:
db.cursor = db.con.cursor()
retval = func(*args)
db.cursor.close()
return retval
您可以在此处使用try:/finally来确保即使引发异常也关闭游标;这也简化了代码,因为finally套件总是被执行,即使在try块中返回:
db.cursor = db.con.cursor()
try:
return func(*args)
finally:
db.cursor.close()
另一种选择是使用游标作为上下文管理器;在这种情况下,任何事务也将自动为您提交;在异常情况下,事务将回滚。在这两种情况下,当上下文退出时,游标也将关闭:
with db.con.cursor() as db.cursor:
return func(*args)
请参阅我们的SQL文档中的cursors as context managers。
这篇关于Python中的修饰函数始终返回NONE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
织梦狗教程
本文标题为:Python中的修饰函数始终返回NONE
基础教程推荐
猜你喜欢
- 在 Django Admin 中使用内联 OneToOneField 2022-01-01
- 对多索引数据帧的列进行排序 2022-01-01
- matplotlib 设置 yaxis 标签大小 2022-01-01
- Python,确定字符串是否应转换为 Int 或 Float 2022-01-01
- Python 中是否有任何支持将长字符串转储为块文字或折叠块的 yaml 库? 2022-01-01
- Kivy 使用 opencv.调整图像大小 2022-01-01
- 比较两个文本文件以找出差异并将它们输出到新的文本文件 2022-01-01
- kivy 应用程序中的一个简单网页作为小部件 2022-01-01
- 在 Python 中将货币解析为数字 2022-01-01
- 究竟什么是“容器"?在蟒蛇?(以及所有的 python 容器类型是什么?) 2022-01-01
