Как подмодули python разделяют между собой скудный ресурс?


Я разбиваю большой монолитный файл 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 4

2 ответа:

Вы, безусловно, можете совместно использовать объект connection между модулями 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

Ваш другой код, который использует databse, может выглядеть следующим образом:

# other_module.py
import db
curs = db.get_connection().cursor()
# do stuff
curs.close()

Я ломаю голову над тем, что делать с полудефицитными ресурсами, такими как мое соединение с MySQL.

Я не уверен, что мой способ особенно питонский, но я просто помещаю свой "материал, который будет использоваться многими модулями" в отдельный модуль, который я импортирую индивидуально в каждом модуле, в котором мне нужно его использовать.

EDIT: методы класса-это то, что я использую, когда хочу автоматически инициализировать что-то только один раз.