我在网上找到了下面的内容,但是从我对Python的一点接触中,我意识到一个人可以在飞行中将函数附加到对象上。我也意识到Python中的所有东西都是对象。我还不明白人们打算用下面的代码和它的用例来实现什么。这是我需要帮助的部分:
run_sql_command.c =c
def get_sql_object(c):
def run_sql_command(command, arguments=[]):
c.execute(command, arguments)
return c.fetchall()
run_sql_command.c = c
return run_sql_command发布于 2011-09-08 04:42:30
该行将一个属性c添加到函数run_sql_command,为其提供传递给函数get_sql_object()的值,假设是一个数据库游标。你可能已经知道这么多了。
由于此代码段的作用域有限,该语句根本没有任何用处。在更大的上下文中,游标可以在代码中的其他地方重用。在代码的其他部分查找对.c属性的访问,并查看对它做了什么。
发布于 2011-09-08 04:39:51
这里(我相信)的想法是,有人正在创建一个占位符对象,该对象保留对游标c的引用,以便以后可以用它来执行查询。建议的用法可能如下所示:
c = DBConnectionObject.cursor()
myExecutor = get_sql_object(c)
# some amount of code later
rows = myExecutor(Queries.GetAllUsersByFName, ['Larry', 'Bob'])--针对一些评论--
我发现,在不稳定的环境中尝试保持游标可能会导致问题,在这种环境中,并不总是保证数据库连接保持连接。我选择了这种方法:
class DBConnection(object):
def __init__(self, dbpath):
self.dbPath = dbpath
# Any connection object here, really.
self._conn = kinterbasdb.connect()
def cursor(self, query, params = None):
try:
cursor = self._conn.cursor()
if params:
cursor.execute(query, params)
else:
cursor.execute(query)
return cursor
except (kdb.ProgrammingError, AttributeError), e:
print e
def qry(self, query, params = None):
cursor = self.cursor(query, params)
return [[x[0].title() for x in cursor.description]] + [r for r in cursor.fetchall()]然后,创建一个全局数据库连接,如下所示:
dbcon = DBConnection('/path/to/mydb.fdb')并使用以下命令运行查询:
rows = dbcon.qry(Queries.GetSomething)或者:
filtered = dbcon.qry(Queries.FilteredQuery, ['my', 'parameters'])我省略了一些代码,这些代码在连接断开时执行错误处理/重新连接到数据库,但大意就在这里。这样,游标就会在需要、使用和允许超出作用域的时候创建,让我集中处理错误。
发布于 2011-09-08 04:42:09
我认为run_sql_command.c的存在是为了保持对c的可访问引用,例如稍后关闭它。
https://stackoverflow.com/questions/7340169
复制相似问题