gpt4 book ai didi

python - Python 中的修饰函数总是返回 None

转载 作者:行者123 更新时间:2023-11-28 22:48:55 26 4
gpt4 key购买 nike

我对 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 block 中返回时也是如此:

db.cursor = db.con.cursor()
try:
return func(*args)
finally:
db.cursor.close()

另一种选择是使用游标作为上下文管理器;在这种情况下,任何交易也将自动为您提交;在异常情况下,事务将被回滚。在任何一种情况下,游标都将在上下文退出时关闭:

with db.con.cursor() as db.cursor:
return func(*args)

参见 cursors as context managers在 oursql 文档中。

关于python - Python 中的修饰函数总是返回 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24618964/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com