Loading object properties from an external file

Recently I came up with the idea that I will hold the running properties in the configuration file. The idea was to use the Python syntax but keeps it simple as possible.
The second thing is that the config file can be anywhere and I do not want force people to make any Python modules (with those strange __init__.py files). They will simply forget to create.
On the other hand I want to keep those attributes in the class object because then I can use that object in other part of the program. First idea was to simply use execfile()
Here is how I overcome the problem, I create a BaseSettings class with the constructor that takes an path to the settings file:

class BaseSettings(object):
  def __init__(self, settings_file):
    """Constructor of the settings class.

      Args:
        settings_file: The full path to the settings file.
    """

    _required_sections = set([
        'ANGLES', 
        'DIHEDRALS', 
        'PAIRS', 
        'ATOM_PAIRS', 
        'BOND_CONFIG',
        'TOTAL_NUMBER_OF_CROSSLINKS'
        ])
    settings_variables = {}
    copy_globals = globals().copy()
    try:
      execfile(settings_file, copy_globals, settings_variables)
    except SyntaxError as ex:
      print 'There is an error in your config file %s in line %s' % (
          ex.filename, ex.lineno)
      print '%d: %s' % (ex.lineno, ex.text)
      print ex.msg
      sys.exit(2)

    # Checks if some attributes are missing in the settings file.
    missing_sections = _required_sections - set(settings_variables)

    if missing_sections:
      Exception(
          'Invalid settings file, those sections are missing: %s' % (
              ','.join(missing_sections))
    # Loads the variables as it they would be and attributes of the class.
    self.__dict__.update(settings_variables)

and then I use execfile() with the copied globals() and the empty dict settings_variables that works as the container for the locals(). I had to copy globals dict because otherwise I had those attributes in the globals.
Afterwards the variables from the settings file can be found in the settings_variables dictionary. So the only things was to update the __dict__ of the class with those variables.

No comments: