Как использовать переменные, уже определенные в ConfigParser - PullRequest
13 голосов
/ 15 февраля 2011

Я использую ConfigParser в Python

config.ini is

[general]
name: my_name
base_dir: /home/myhome/exp

exe_dir: ${base_dir}/bin

Здесь я хочу, чтобы exp_dir становится /home/myhome/exp/bin, а не ${base_dir}/bin.

Это означает, что ${base_dir} будет заменен на /home/myhome/exp automatically.

Ответы [ 3 ]

21 голосов
/ 15 февраля 2011

Вы можете использовать ConfigParser интерполяция

Помимо основной функциональности, SafeConfigParser поддерживает интерполяция. Это означает, что значения могут содержат строки формата, которые относятся к другие значения в том же разделе, или значения в специальном разделе DEFAULT. Дополнительные значения по умолчанию могут быть предоставлены на инициализации.

Например:

[My Section] 
foodir: %(dir)s/whatever 
dir=frob 
long: this value continues    
    in the next line 

разрешит% (dir) к значению дир (лягушка в данном случае). Все эталонные расширения сделаны на спрос.

Ваш пример становится:

[general]
name: my_name
base_dir: /home/myhome/exp

exe_dir: %(base_dir)s/bin
6 голосов
/ 15 февраля 2011

Вместо "$ {foo}" напишите "% (foo) s". (См. http://docs.python.org/library/configparser.html и найдите «интерполяция». Это работает для обычного ConfigParser или SafeConfigParser.)

2 голосов
/ 29 февраля 2016

В Python 3 вы можете использовать ${base_dir}/bin, а расширенная интерполяция позволяет использовать переменные из других разделов. Пример:

[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}
...