Интерполяция Python ConfigParser из внешнего раздела
С помощью Python ConfigParser можно ли использовать интерполяцию по внешним разделам? Мой разум мне говорит, Я видел, что это возможно где-то, но я не могу найти его при поиске.
этот пример не работает, но он должен дать представление о том, что я пытаюсь сделать.
[section1]
root = /usr
[section2]
root = /usr/local
[section3]
dir1 = $(section1:root)/bin
dir2 = $(section2:root)/bin
обратите внимание, что я использую Python 2.4.
4 ответов
в python 3.2 и выше это совершенно верно:
[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:
Я только что видел, что вы используете python 2.4, так что нет, интерполяция раздела не может быть выполнена в python 2.4. Он был введен в python 3.2 - см. раздел 13.2.5-интерполяция значений ConfigParser.
класс
configparser.ExtendedInterpolation
альтернативный обработчик для интерполяции, которая реализует более продвинутый синтаксис, используемый для экземпляр в КЦ.постройка. Расширенная интерполяция используется ${section: option} для обозначения значения из внешнего раздела. Интерполяция может охватывать несколько уровней. Для удобства, если раздел: часть опущена, интерполяция по умолчанию для текущего раздел (и, возможно, значения по умолчанию из специального раздела). Например, конфигурация, указанная выше с помощью basic интерполяция, будет выглядеть так с расширенной интерполяцией:
[Paths] home_dir: /Users my_dir: ${home_dir}/lumberjack my_pictures: ${my_dir}/Pictures
значения из других разделов также могут быть извлечены:
[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}
У вас есть доступ к разделу специальный случай [по умолчанию]. Значения, определенные здесь, могут быть доступны через интерполяцию из других разделов даже для более старых версий Python.
Если вы застряли с python 2.7, и вам нужно сделать интерполяцию поперечного сечения, это достаточно легко сделать вручную с помощью регулярных выражений.
вот код:
INTERPOLATION_RE = re.compile(r"$\{(?:(?P<section>[^:]+):)?(?P<key>[^}]+)\}")
def load_something_from_cp(cp, section="section"):
result = []
def interpolate_func(match):
d = match.groupdict()
section = d.get('section', section)
key = d.get('key')
return cp.get(section, key)
for k, v in cp.items(section):
v = re.sub(INTERPOLATION_RE, interpolate_func, v)
result.append(
(v, k)
)
return result
Caveeats:
- в интерполяции нет рекурсии
- при разборе многих разделов вам нужно будет как-то угадать текущий раздел.
я столкнулся с этим в проекте, над которым я работаю прямо сейчас, и я реализовал быстрое расширение на ConfigParser.SafeConfigParser
класс, в котором я перезаписал