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

7

我有一个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个回答

9
每次我导入这个模块,Python都会执行它。这是不正确的。Python只会在第一次导入时执行你的模块全局变量。然后,生成的模块对象存储在sys.modules中,并用于后续导入。请参见import语句文档:一旦知道模块的名称(除非另有说明,否则“模块”一词将同时指代包和模块),就可以开始搜索模块或包。首先检查的地方是sys.modules,所有已经导入的模块的缓存。如果在那里找到模块,则在导入的步骤(2)中使用它。你正在做的是正确的方法,这正是标准Python库模块所做的。

了解了,谢谢! - blueSurfer

2
你可以这样做。无需安装,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

1

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

Python文档:如何在模块之间共享全局变量

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

只需在应用程序的所有模块中导入config模块,该模块就会作为全局名称可用。由于每个模块只有一个实例,对模块对象所做的任何更改都会反映在整个程序中。

例如:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接