Python中的修饰函数始终返回NONE

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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)