【发布时间】:2013-06-19 09:55:21
【问题描述】:
我的应用程序从配置文件中读取了许多常量。然后在整个程序的各个地方使用这些常量。这是一个例子:
import ConfigParser
config = ConfigParser.SafeConfigParser()
config.read('my.conf')
DB_HOST = config.get('DatabaseInfo', 'address')
DB_PORT_NUMBER = config.getint('DatabaseInfo', 'port_number')
DB_NUMBER = config.getint('DatabaseInfo', 'db_number')
IN_SERVICE = config.get('ServerInfo', 'in_service')
IN_DATA = config.get('ServerInfo', 'in_data')
等等……
然后,我在整个程序中定义了使用这些常量的函数。这是一个例子:
def connect_to_db():
return get_connection(DB_HOST, DB_PORT_NUMBER, DB_NUMBER)
但有时,当我在测试或使用 REPL 时,我不想使用配置文件中定义的值。
所以我改为将函数定义为除了常量之外的参数:
def connect_to_db(db_host, db_port_number, db_number):
return get_connection(db_host, db_port_number, db_number)
然后当我的程序运行时,常量全部传递给我的main,它需要调用其他函数,然后调用这些函数并创建需要常量的类(可能都在不同的模块中):
def main(db_host, db_port_number, db_number, in_service, in_data):
intermediate_function(
db_host, db_port_number, db_number, other, parameters, here
)
other_intermediate_function(in_service, in_data, more, params, here)
# etc...
def intermediate_function(db_host, db_port_number, db_number):
# Other processing...
c = connect_to_db(db_host, db_port_number, db_number)
# Continued...
if __name__ == '__main__':
main(DB_HOST, DB_PORT_NUMBER, DB_NUMBER, IN_SERVICE, IN_DATA)
问题在于,如果常量太多,这很快就会变得笨拙。如果我需要添加另一个常量,我有几个地方需要修改以确保我的代码不会中断。这是维护的噩梦。
什么是处理许多不同配置常量的正确 Pythonic 方式,以便代码仍然易于修改和易于测试?
【问题讨论】:
-
亲爱的@user1436026,如果您认为我的解决方案是真正的帮助,请不要犹豫accept the answer!谢谢!
标签: python