Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的修饰函数始终不返回任何值_Python_Decorator_Python Decorators_Nonetype - Fatal编程技术网

Python中的修饰函数始终不返回任何值

Python中的修饰函数始终不返回任何值,python,decorator,python-decorators,nonetype,Python,Decorator,Python Decorators,Nonetype,我对Python中的装饰器有一个奇怪的问题。基本上,我正在尝试包装一个函数,这样它就可以在每个请求中创建和拆卸游标。不要问-这只是一个示例,对于演示这个问题非常有用!除此之外,我还有其他打算 以下是一个示例: class DB(object): """Our DB methods and connections""" def __init__(self): self.con = oursql.connect(host=host, user=user, passw

我对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)
这是可行的,但我从包装函数得到的结果只返回一个:

[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()

您将忽略包装函数的返回值:

[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块中返回:

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

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

请参阅oursql文档中的。

您忽略了包装函数的返回值:

[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块中返回:

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

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

请参阅我们的SQL文档。

在包装器中,db从何而来?@user2357112:在if _u名称下,guard db被分配为全局变量。事实如此。这可能不是它应该来自的地方;它可能应该使用第一个参数,而不是全局参数。无论如何,在包装器中db来自何处?@user2357112:在if _uname下,guard db被指定为全局参数。事实如此。这可能不是它应该来自的地方;它可能应该使用第一个参数,而不是全局参数。