2013-12-25 3 views
0

У меня есть вопрос, где мои классы держать создание новых соединений БД, и я пытаюсь понять, что я делаю неправильно ... это моя структура:Почему переменная используется в некоторых классах, но не для других?

index.py 
|_ a/const.py (not a Class, just several functions) 
     db = None 

     def get_connection(): 
     global db 

     if not db:  
      db = created_new_connection() 
      print "New connection has been created" 
     else: 
      print "Connection already exists" 

     return db 

|_ a/group.py (import const, Class) 
|_ a/user.py (import const, Class) 

«index.py» импорт «Const «а другой модуль, который позже использует„группу“и„пользователь“

Когда я бегу index.py, я получаю:

group.py "New connection has been created" 
user.py "New connection has been created" 

Таким образом, для теста, я попытался создать соединение в» индексе. py ", но теперь я получаю:

index.py "New connection has been created" 
group.py run func1() "Connection already exists" 
group.py run func2() "Connection already exists" 
user.py "New connection has been created" 

Теперь - я в замешательстве. как «группа», так и «пользователь» написаны почти точно так же. как это происходит, когда «группа» запускает «get_connection()», она работает так, как ожидалось (уже существует), а позже, когда «пользователь» запускает «get_connection()», он создает новое соединение ....

Что интересно (для меня) заключается в том, что когда я создал файлы (a, b, c, d) в тех же каталогах (чтобы сохранить структуру) и импортировал «c.py» во все файлы, тогда «a» создал соединение, но «b» и «b» d "не создали новое соединение, они использовали ту, которая все еще открыта .... (что я и ожидаю)

Любые идеи? спасибо заранее ...

+0

'get_connection' не должен работать ни при каких условиях; 'db' является локальным для' get_connection', поэтому тест 'if not db' должен поднять' UnboundLocalError'. – user2357112

+0

Извините, но я оставил это, я уже использую «глобальный db», поэтому в «group.py» он работает ... он также работает, если внутри group.py есть еще одна функция, вызывающая get_connection() - it скажет, что «уже существует» –

+0

Возможно, у вас могут возникнуть проблемы с вашим пути импорта, в результате чего один и тот же файл будет импортироваться несколько раз, как очень похожие, но четкие модули. – user2357112

ответ

1

Попробуйте изменить его к этому:

def get_connection(): 
    global db 

    if not db:  
     db = created_new_connection() 
     print "New connection has been created" 
    else: 
     print "Connection already exists" 

    return db 

Если у вас есть это единственная возможность для функции для ввода первого блока во второй раз, что created_new_connection() функция возвращает то, что составляет False (например, None или пустой str, или пустой list, ...).

В качестве альтернативы может возникнуть ситуация, когда Python загружает модуль дважды, как описано here: в основном, если вы импортируете модуль с использованием разных относительных путей, Python будет рассматривать их как разные модули и загружать их дважды. Предлагаемое решение из этого сообщения в блоге - всегда загружать модули, используя их пути верхнего уровня.

+0

Извините, я отредактирую код, я уже делаю это ...все еще не работает –

+0

@Ricky Проверьте ссылку, которую я предоставил. – BartoszKP

+0

Да, продолжая комментарий @ user2357112, что модули загружаются дважды, из вашей ссылки я выясняю, что проблема является символической ссылкой, которую я сделал, чтобы «из bla import const» (потому что они не находились на одном уровне каталогов ...), напечатав print const .__ name__ Я вижу это мгновенно ... большое вам спасибо! –

0

Вместо использования глобальной переменной вы также можете использовать класс «Borg». Это альтернатива Python для одноэлементного класса.

database.py

class Database: 

    __shared_state = {} 
    db = None 

    def __init__(self): 
     self.__dict__ = self.__shared_state 

    def get_connection(self): 

     if not self.db: 
      self.db = self.create_new_connection() 
      print "New connection has been created" 
     else: 
      print "Connection already exists" 

     return self.db 

    def create_new_connection(self): 
     # create and return new connection 

Затем импортировать этот класс, как from database import Database и получить связь с Database().get_connection().

+0

Не работает ... в общем, я не уверен, как это работает ... что делает self.db общим после того, как первый модуль будет с ним и уничтожен ?, другое дело, вы оставили это по ошибке (db = Нет) или предполагается, что у него есть цель? –

+0

Зачем это было бы уничтожено? В процессе python модуль импортируется только один раз (даже если вы импортируете его из нескольких других модулей), и состояние в этом модуле поддерживается. Я помещаю 'db = None', потому что иначе вы получите AttributeError, потому что он не будет определен. Проверьте, что говорит BartoszKP в конце ответа. – rednaw

+0

Да, просто идея ссылки «Борг» заключается в том, что независимо от того, как я пишу код, он гарантирует, что только один экземпляр этого модуля загружается дважды. Я думал, что это лучший способ сделать это ... –

Смежные вопросы