Как подмодули Python делят дефицитный ресурс между ними? - PullRequest
4 голосов
/ 18 июля 2011

Я разбиваю большой монолитный файл 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-75 тыс. Python и группа людей, которым нужно работать с кодом, плюс есть довольно четкие концептуальные группировки функциональности.

Ответы [ 2 ]

8 голосов
/ 18 июля 2011

Вы, безусловно, можете совместно использовать объект соединения между модулями Python, и ваша идея сделать это соединение переменной с областью действия модуля будет вполне приемлемо (за некоторыми исключениями, модули Python являются одиночными, поэтому даже если они импортируются несколько раз из разных файлов, они загружаются только один раз). Вы, вероятно, не хотите совместно использовать один объект курсора между модулями, особенно если вы используете многопоточную среду (например, запускаете веб-приложение в mod_wsgi или аналогичном).

Одним из предложений может быть перемещение соединения в модуль, специфичный для базы данных, например 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()
2 голосов
/ 18 июля 2011

Что меня озадачивает, так это то, что делать с полуна дефицитными ресурсами, такими как мое соединение с MySQL.просто поместите мои «вещи, которые будут использоваться многими модулями» в отдельный модуль, который я импортирую индивидуально в каждый модуль, в котором мне нужно его использовать.

РЕДАКТИРОВАТЬ: методы класса - это то, что я используюкогда я хочу автоматически инициализировать что-то только один раз.

...