在Python中初始化全局变量的正确方法

时间:2014-05-27 12:57:56

标签: 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库,你将如何处理这个问题。

3 个答案:

答案 0 :(得分:6)

  

每次我导入这个模块时,Python都会执行它

这不正确。 Python第一次导入时,只执行一次模块全局 。然后,生成的模块对象存储在sys.modules中,并重新用于后续导入。请参阅import statement documenation

  

一旦知道模块的名称(除非另有说明,术语“模块”将指代包和模块),搜索模块或包可以开始。检查的第一个位置是sys.modules,即先前导入的所有模块的缓存。如果在那里找到该模块,那么它将在导入的步骤(2)中使用。

您正在做的是正确的方法,而且正是标准Python库模块所做的。

答案 1 :(得分: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))

配置文件:

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

答案 2 :(得分:0)

使用config.py共享全局变量:

Python doc:how-do-i-share-global-variables-across-modules

  

在单个模块中跨模块共享信息的规范方法   程序是创建一个特殊的模块(通常称为config或cfg)。

     

只需在应用程序的所有模块中导入配置模块;该   然后,模块可用作全局名称。因为只有   每个模块的一个实例,对模块对象进行的任何更改   无处不在。

例如:

config.py:

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