2014-05-27 4 views
3

У меня есть модуль Python, который инициализирует некоторые глобальные переменные; что-то вроде этого:Правильный способ инициализации глобальных переменных в Python

#!/usr/bin/env python 
import re 

"""My awesome python library.""" 

# A word list from the standard UNIX dictionary. 
with open('/usr/share/dict/words', 'rt') as f: 
    WORDS_LIST = f.read().split('\n') + ['http'] + ['fubob'] 

# Some compiled regular expressions. 
COMPILED_REG1 = re.compile("a") 
COMPILED_REG2 = re.compile("b") 

# Some constants. 
A = 10 
B = 20 

def say_hello(): print('hello') 
def do_something(): return 'something' 

Конечно, это работает, но я не чувствую, что это правильный способ сделать это: каждый раз, когда я импортировать этот модуль Python собирается выполнить. В этом примере он будет читать файл и компилировать регулярные выражения.

Я читал, что некоторые из них создают файл config.py и делают что-то с этим, но я точно не знаю, как это работает.

Итак, я хотел бы знать, как бы вы справились с этим, если вам нужно создать стандартную библиотеку Python.

ответ

5

каждый раз, когда я импортировать этот модуль Python собирается выполнить это

Это не правильно. Python выполняет ваш глобальный глобальный модуль только один раз, первый раз, когда он импортируется. Полученный объект модуля затем сохраняется в sys.modules и повторно используется для последующего импорта. Смотрите import statement documenation:

После того, как имя модуля известно (если не указано иное, термин «модуль» будет относиться к обоим пакетам и модулей), поиск модуля или пакета может начаться. Первое место проверено: sys.modules, кеш всех модулей, которые были импортированы ранее. Если модуль найден там, он используется на этапе (2) импорта.

Что вы делаете, это правильный способ сделать это, и именно это делают стандартные модули библиотеки Python.

+0

Хорошо знать. Спасибо! – blueSurfer

0

Вам холодно делать это. SafeConfigParser должны быть доступны без установки

Python файла:

from ConfigParser import SafeConfigParser 
try: 
    # Getting DB connection data from config file 
    parser = SafeConfigParser() 
    parser.read('config.txt') 

    dhost = parser.get('db', 'host') 
    ddatabase = parser.get('db', 'db') 
    duser = parser.get('db', 'user') 
    dpassword = parser.get('db', 'pw') 

except Exception, err: 
    print str(err) 
    logger.error(str(err)) 

Config файла:

[db] 
host = 179.10.13.2 
db = main 
user = max 
pw = c45v243v5b2v6v25v6554v9 
0

Совместное использование глобальных переменных с помощью config.py:

Python документ: how-do-i-share-global-variables-across-modules

Канонический способ обмена информацией между модулями в рамках одной программы - создать специальный модуль (часто называемый config или cfg).

Просто импортируйте конфигурационный модуль во все модули вашего приложения; модуль становится доступным в качестве глобального имени. Потому что есть только один экземпляр каждого модуля, любые изменения, внесенные в объект модуля, получают , отраженные повсюду.

Например:

конфигурации.ру:

x = 0 # Default value of the 'x' configuration setting 

mod.py:

import config 
config.x = 1 

main.py:

import config 
import mod 
print config.x 
Смежные вопросы