我的应用程序从配置文件中读取了许多常量。然后在整个程序的各个地方使用这些常量。这是一个例子:
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')
ETC...
然后,我在整个程序中定义了使用这些常量的函数。这是一个例子:
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 方式是什么,以便代码仍然易于修改和易于测试?