Un pattern comune che uso sui miei programmi non banali è di avere una classe che analizzi un file di configurazione (di solito YAML) e rende gli elementi nei valori della configurazione disponibili come proprietà sulla classe.
Quindi importerò questa classe altrove nel mio programma ogni volta che devo fare riferimento alla configurazione fornita dall'utente
#config.yml
app_name: 'Awesome Program'
base_url: 'http://example.com/awesome'
#appconfig.py
import yaml
class AppConfig(object):
'''Imports the contents of config.yml as property values'''
def __init__(self):
with open('config.yml') as cfgfile:
y = yaml.load(cfgfile)
for key in y:
setattr(self, key, y[key])
CONF = AppConfig()
#app.py
from appconfig import CONF
appname = CONF.app_name
base_url = CONF.base_url
# and so forth
Tuttavia, ho notato che questo tende a rendere infelici determinati IDE. PyCharm in particolare tende a pensare che questo tipo di stato globale (anche se è di sola lettura) è strano, contrassegnando in giallo qualsiasi utilizzo della variabile CONF come avviso di "file implicito implicito" di basso grado.
Una conversazione sul bug tracker di PyCharm e un paio di altre conversazioni su Hacker News implicano che questo è qualcosa che non dovrei fare .
È decisamente conveniente, e non mi ha ancora messo nei guai, ma c'è un modo migliore / più idiomatico / più appropriato che dovrei gestire? Si noti che la configurazione è interamente di sola lettura e quindi la sincronizzazione, il blocco e così via sono problemi di cui non sono preoccupato.