Skip to main content

Config file sections as objects

Project description

Latest PyPI Version License Downloads

Fileconfig turns config file sections into instances of your class. Create a class referring to an INI file collecting the arguments for the different instances to be created. Calling the class with the section name as parameter will return the instance with the parameters specified in the given section.


$ pip install fileconfig


Create as subclass of fileconfig.Config and set its filename attribute to the path of your INI file.

If the filename is relative, it is resolved relative to the path of the module where your class is defined (i.e. not relative to the current working directory if its file not happens do be there).

>>> import fileconfig

>>> class Cfg(fileconfig.Config):
...     filename = 'examples/pet-shop.ini'
...     def __init__(self, key, **kwargs):
...         self.key = key
...         self.__dict__.update(kwargs)
...     def __str__(self):
...         items = ('  %r: %r' % (k, v) for k, v in sorted(self.__dict__.iteritems()))
...         return '{\n%s\n}' % ',\n'.join(items)

On instance creation, the __init__ method will be called with the section name (key) and the keyword parameterss from the given section of the specified file.

Suppose your INI file begins like this:

species = Norwegian blue
can_talk = yes
quantity = 0
characteristics = beatiful plumage, pining for the fjords

To retrieve this instance, call the class with its section name.

>>> c = Cfg('parrot')

>>> print c
  'can_talk': 'yes',
  'characteristics': 'beatiful plumage, pining for the fjords',
  'key': 'parrot',
  'quantity': '0',
  'species': 'Norwegian blue'


Only one instance will be created, cached and returned for each config file section (a.k.a. the singleton pattern):

>>> Cfg('parrot') is c

The constructor is also idempotent:

>>> Cfg(c) is c

The default __repr__ of instances allows roundtrips:

>>> c


You can specify a space-delimited list of aliases for each section:

aliases = snail special_offer
species = slug
can_talk = no
quantity = 1

For changig the delimiter, see below.

Aliases map to the same instance:

>>> s = Cfg('special_offer')

>>> s

>>> s is Cfg('snail') is Cfg('slug')

Inspect instance names (key + aliases):

>>> s.key

>>> s.aliases
['snail', 'special_offer']

>>> s.names
['slug', 'snail', 'special_offer']


Config file sections can inherit from another section:

inherits = parrot
can_talk = no
characteristics = dead, totally stiff, ceased to exist

Specified keys override inherited ones:

>>> print Cfg('polly')
  'can_talk': 'no',
  'characteristics': 'dead, totally stiff, ceased to exist',
  'inherits': 'parrot',
  'key': 'polly',
  'quantity': '0',
  'species': 'Norwegian blue'

Sections can inherit from a single section. Multiple or transitive inheritance is not supported.


Use the class to iterate over the instances from all section:

>>> list(Cfg)
[__main__.Cfg('parrot'), __main__.Cfg('slug'), __main__.Cfg('polly')]

Print the string representation of all instances:

>>> Cfg.pprint_all()  # doctest: +ELLIPSIS
  'can_talk': 'yes',
  'characteristics': 'beatiful plumage, pining for the fjords',
  'key': 'parrot',


Apart from the key, aliases, and inherits parameters, your __init__ method receives the unprocessed strings from the config file parser.

Use the __init__ method to process the other parameters to fit your needs.

>>> class Pet(Cfg):
...     def __init__(self, can_talk, quantity, characteristics=None, **kwargs):
...         self.can_talk = {'yes':True, 'no': False}[can_talk]
...         self.quantity = int(quantity)
...         if characteristics is not None and characteristics.split():
...             self.characteristics = [c.strip() for c in characteristics.split(',')]
...         super(Pet, self).__init__(**kwargs)

>>> print Pet('polly')
  'can_talk': False,
  'characteristics': ['dead', 'totally stiff', 'ceased to exist'],
  'inherits': 'parrot',
  'key': 'polly',
  'quantity': 0,
  'species': 'Norwegian blue'

This way, the __init__ method also defines parameters as required or optional, set their defaults, etc.


To use a different delimiter for aliases override the _split_aliases method on your class. Make it a staticmethod or classmethod that takes a string argument and returns the splitted list.

By default, fileconfig will use ConfigParser.SafeConfigParser from the standard library to parse the config file. To use a different parser, override the _parser attribute in your fileconfig.Config subclass.

Fileconfig raises an error, if the config file is not found. If you want this error to pass silently instead, set the _pass_notfound atribute on your subclass to True.


Fileconfig is distributed under the MIT license.

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for fileconfig, version 0.2
Filename, size File type Python version Upload date Hashes
Filename, size (14.1 kB) File type Source Python version None Upload date Hashes View

Supported by

Pingdom Pingdom Monitoring Google Google Object Storage and Download Analytics Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page