python config方法_python-在config.py中提供全局配置变量的大多数Python方法?

在我对过度复杂的简单事物的无尽追求中,我正在研究最“ Pythonic”的方法来在Python egg包中的典型“ config.py”中提供全局配置变量。

传统方式(啊,好吧,#define!)如下:

MYSQL_PORT = 3306

MYSQL_DATABASE = 'mydb'

MYSQL_DATABASE_TABLES = ['tb_users', 'tb_groups']

因此,以下列方式之一导入全局变量:

from config import *

dbname = MYSQL_DATABASE

for table in MYSQL_DATABASE_TABLES:

print table

要么:

import config

dbname = config.MYSQL_DATABASE

assert(isinstance(config.MYSQL_PORT, int))

这是有道理的,但有时可能会有些混乱,尤其是当您尝试记住某些变量的名称时。 此外,提供以变量为属性的“配置”对象可能更灵活。 因此,从bpython config.py文件开始,我想到了:

class Struct(object):

def __init__(self, *args):

self.__header__ = str(args[0]) if args else None

def __repr__(self):

if self.__header__ is None:

return super(Struct, self).__repr__()

return self.__header__

def next(self):

""" Fake iteration functionality.

"""

raise StopIteration

def __iter__(self):

""" Fake iteration functionality.

We skip magic attribues and Structs, and return the rest.

"""

ks = self.__dict__.keys()

for k in ks:

if not k.startswith('__') and not isinstance(k, Struct):

yield getattr(self, k)

def __len__(self):

""" Don't count magic attributes or Structs.

"""

ks = self.__dict__.keys()

return len([k for k in ks if not k.startswith('__')\

and not isinstance(k, Struct)])

和一个“ config.py”,该类导入该类,内容如下:

from _config import Struct as Section

mysql = Section("MySQL specific configuration")

mysql.user = 'root'

mysql.pass = 'secret'

mysql.host = 'localhost'

mysql.port = 3306

mysql.database = 'mydb'

mysql.tables = Section("Tables for 'mydb'")

mysql.tables.users = 'tb_users'

mysql.tables.groups = 'tb_groups'

并以这种方式使用:

from sqlalchemy import MetaData, Table

import config as CONFIG

assert(isinstance(CONFIG.mysql.port, int))

mdata = MetaData(

"mysql://%s:%s@%s:%d/%s" % (

CONFIG.mysql.user,

CONFIG.mysql.pass,

CONFIG.mysql.host,

CONFIG.mysql.port,

CONFIG.mysql.database,

)

)

tables = []

for name in CONFIG.mysql.tables:

tables.append(Table(name, mdata, autoload=True))

这似乎是在包内存储和获取全局变量的一种更具可读性,表达性和灵活性的方式。

有史以来最大的想法? 应对这些情况的最佳实践是什么? 在包中存储和获取全局名称和变量的方式是什么?

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页