Search code examples
pythonpython-2.7python-2.xconfigparserpython-2.4

Python ConfigParser interpolation from foreign section


With Python ConfigParser, is it possible to use interpolation across foreign sections? My mind seems to tell me I've seen that it's possible somewhere, but I can't find it when searching.

This example doesn't work, but it's to give an idea of what I'm trying to do.

[section1]
root = /usr

[section2]
root = /usr/local

[section3]
dir1 = $(section1:root)/bin
dir2 = $(section2:root)/bin

Note that I'm using Python 2.4.


Solution

  • In python 3.2 and up this is perfectly valid:

    [Common]
    home_dir: /Users
    library_dir: /Library
    system_dir: /System
    macports_dir: /opt/local
    
    [Frameworks]
    Python: 3.2
    path: ${Common:system_dir}/Library/Frameworks/
    
    [Arthur]
    nickname: Two Sheds
    last_name: Jackson
    my_dir: ${Common:home_dir}/twosheds
    my_pictures: ${my_dir}/Pictures
    python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}
    

    Edit:

    I just saw that you are using python 2.4, so no, section interpolation cannot be done in python 2.4. It was introduced in python 3.2 - See section 13.2.5 - ConfigParser Interpolation of values.

    class configparser.ExtendedInterpolation

    An alternative handler for interpolation which implements a more advanced syntax, used for instance in zc.buildout. Extended interpolation is using ${section:option} to denote a value from a foreign section. Interpolation can span multiple levels. For convenience, if the section: part is omitted, interpolation defaults to the current section (and possibly the default values from the special section). For example, the configuration specified above with basic interpolation, would look like this with extended interpolation:

       [Paths]
       home_dir: /Users
       my_dir: ${home_dir}/lumberjack
       my_pictures: ${my_dir}/Pictures
    

    Values from other sections can be fetched as well:

       [Common]
       home_dir: /Users
       library_dir: /Library
       system_dir: /System
       macports_dir: /opt/local
    
       [Frameworks]
       Python: 3.2
       path: ${Common:system_dir}/Library/Frameworks/
    
       [Arthur]
       nickname: Two Sheds
       last_name: Jackson
       my_dir: ${Common:home_dir}/twosheds
       my_pictures: ${my_dir}/Pictures
       python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}