4

我将一个大型的单体 python 文件分解为六个单独的子模块。

最初在 onebigfile.py 中,我有

conn = MySqldb.connect()
c = conn.cursor()

然后一个函数会这样使用它:

def getFromDB():
     c.execute(sql)

现在,我已经将我的模块重组为

NewModule/
  __init__.py
  users.py
  accounts.py
  sixmoreofthese.py

我困惑的是如何处理像我的 MySQL 连接这样的半稀缺资源。

有没有办法访问父命名空间,例如conn.并且c.可以放入__init__.py?我不想实例化一大堆与 MySQL 的连接。只是将它们转储到那里并像它们是全局命名空间的一部分一样调用它们是行不通的。那是:

__init__.py:
   conn = MySqldb.connect()
   c = conn.cursor() 

> import NewModule
> NewModule.users.login('a','b')
--- login function calls the Mysql c. from the global namespace and can't find it. 

预测一个建议:拆分这些文件是有意义的——大约有 50-75k 的 python,以及需要使用代码的一群人,此外还有非常清晰的功能概念分组。

4

2 回答 2

8

您当然可以在 python 模块之间共享连接对象,并且您将连接作为模块范围变量的想法将很好地实现这一点(除了少数例外,Python 模块是单例的,因此即使它们是从不同文件中多次导入的,它们只加载一次)。您可能不想在模块之间共享单个光标对象,尤其是当您使用多线程环境时(例如,在 mod_wsgi 或类似环境中运行 Web 应用程序)。

一个建议可能是将连接移动到特定于数据库的模块中,例如db.py,并使用get_connection()方法初始化/访问它。这将允许您的应用程序引导并加载它需要优雅地连接(用户名、密码、主机名)的任何配置。这可能很简单:

# db.py
connection = None
def get_connection():
    global connection
    if not connection:
        connection = MySqldb.connect() # possibly with configuration vars passed in
    return connection

您使用数据库的其他代码可能如下所示:

# other_module.py
import db
curs = db.get_connection().cursor()
# do stuff
curs.close()
于 2011-07-18T17:43:39.177 回答
2

我困惑的是如何处理像我的 MySQL 连接这样的半稀缺资源。

我不确定我做的方式是不是特别pythonic,但我只是将我的“被许多模块使用的东西”放在一个单独的模块中,我在我需要使用它的每个模块中单独导入它.

编辑:当我只想自动初始化一次时,我使用类方法。

于 2011-07-18T17:44:30.257 回答