首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >帮助解释Python代码片段

问帮助解释Python代码片段
EN

Stack Overflow用户
提问于 2011-09-08 04:31:17
回答 3查看 131关注 0票数 1

我在网上找到了下面的内容,但是从我对Python的一点接触中,我意识到一个人可以在飞行中将函数附加到对象上。我也意识到Python中的所有东西都是对象。我还不明白人们打算用下面的代码和它的用例来实现什么。这是我需要帮助的部分:

run_sql_command.c =c

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-08 04:42:30

该行将一个属性c添加到函数run_sql_command,为其提供传递给函数get_sql_object()的值,假设是一个数据库游标。你可能已经知道这么多了。

由于此代码段的作用域有限,该语句根本没有任何用处。在更大的上下文中,游标可以在代码中的其他地方重用。在代码的其他部分查找对.c属性的访问,并查看对它做了什么。

票数 0
EN

Stack Overflow用户

发布于 2011-09-08 04:39:51

这里(我相信)的想法是,有人正在创建一个占位符对象,该对象保留对游标c的引用,以便以后可以用它来执行查询。建议的用法可能如下所示:

代码语言:javascript
复制
c = DBConnectionObject.cursor()

myExecutor = get_sql_object(c)

# some amount of code later
rows = myExecutor(Queries.GetAllUsersByFName, ['Larry', 'Bob'])

--针对一些评论--

我发现,在不稳定的环境中尝试保持游标可能会导致问题,在这种环境中,并不总是保证数据库连接保持连接。我选择了这种方法:

代码语言:javascript
复制
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()]

然后,创建一个全局数据库连接,如下所示:

代码语言:javascript
复制
dbcon = DBConnection('/path/to/mydb.fdb')

并使用以下命令运行查询:

代码语言:javascript
复制
rows = dbcon.qry(Queries.GetSomething)

或者:

代码语言:javascript
复制
filtered = dbcon.qry(Queries.FilteredQuery, ['my', 'parameters'])

我省略了一些代码,这些代码在连接断开时执行错误处理/重新连接到数据库,但大意就在这里。这样,游标就会在需要、使用和允许超出作用域的时候创建,让我集中处理错误。

票数 3
EN

Stack Overflow用户

发布于 2011-09-08 04:42:09

我认为run_sql_command.c的存在是为了保持对c的可访问引用,例如稍后关闭它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7340169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档