4

私は大きなモノロシックPythonファイルを6つの別々のサブモジュールに分割しています。

もともとonebigfile.pyで、私は持っていました

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

そして、関数はそれを次のように使用します。

def getFromDB():
     c.execute(sql)

これで、モジュールを次のように再構築しました。

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

私が困惑しているのは、MySQL接続のような半希少なリソースをどうするかです。

親の名前空間にアクセスする方法はありますconn.か?MySQLへの多数の接続をインスタンス化したくありません。それらをそこにダンプして、グローバル名前空間の一部であるかのように呼び出すだけでは機能しません。つまり、次のようになります。c.__init__.py

__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. 

1つの提案を予測するには、これらのファイルを分割するのが理にかなっています。およそ50〜75k相当のPythonと、コードを操作する必要のある人々のグループに加えて、機能のかなり明確な概念的なグループがあります。

4

2 に答える 2

8

確かに Python モジュール間で接続オブジェクトを共有できます。接続をモジュール スコープの変数にするというアイデアは、これをうまく実現します (いくつかの例外を除いて、Python モジュールはシングルトンであるため、異なるファイルから複数回インポートされた場合でも)。 、一度だけロードされます)。特にマルチスレッド環境を使用している場合 (たとえば、mod_wsgi などで Web アプリケーションを実行している場合) は、モジュール間で単一のカーソル オブジェクトを共有したくないでしょう。

1 つの提案は、接続を のようなデータベース固有のモジュールに移動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 に答える