You can use something like this:
Files structure:
myapp/ __init__.py settings.py main.py
settings.py
CONST_A = 'A' CONST_B = 'B'
__init__.py
from . import settings as global_settings class Settings: def __init__(self): for setting in dir(global_settings): if setting.isupper(): setattr(self, setting, getattr(global_settings, setting)) def __setattr__(self, attr, value): if not getattr(self, attr, None): super().__setattr__(attr, value) else: raise TypeError("'constant' does not support item assignment") settings = Settings()
main.py
import settings print(settings.CONST_A) # prints A settings.CONST_A = 'C' # raises TypeError error print(settings.CONST_A) # prints A settings.CONST_C = 'C' # also able to add new constants print(settings.CONST_C) # prints C
Overwritten __setattr__ in Settings class makes all the attributes read-only. The only requirement is to have all the constants in your settings.py written in capital letters. But be aware, that it's not gonna work if you import variables directly:
from settings import CONST_A print(settings.CONST_A) # prints A settings.CONST_A = 'C' # sets C print(settings.CONST_A) # prints C