Уникальные ключи Python ConfigParser для каждого раздела

StackOverflow https://stackoverflow.com/questions/287757

  •  08-07-2019
  •  | 
  •  

Вопрос

Я прочитал часть документы и увидел, что ConfigParser возвращает список пар ключ/значение для параметров в разделе.Я решил, что ключи не обязательно должны быть уникальными внутри раздела, иначе парсер просто вернет сопоставление.Я разработал схему файла конфигурации на основе этого предположения, но затем, к сожалению, понял, что это не так:

>>> from ConfigParser import ConfigParser
>>> from StringIO import StringIO
>>> fh = StringIO("""
... [Some Section]
... spam: eggs
... spam: ham
... """)
>>> parser = ConfigParser()
>>> parser.readfp(fh)
>>> print parser.items('Some Section')
[('spam', 'ham')]

Затем я вернулся и нашел ту часть документов, которую мне нужно должен прочитал:

Секции обычно хранятся в строительном словаре.Альтернативный тип словаря может быть передан конструктору ConfigParser.Например, если тип словаря передается, что сортирует свои ключи, разделы будут отсортированы на спине, как и ключи в каждом разделе.

Чтобы сохранить существующую схему файла конфигурации (которая мне сейчас очень нравится;) я подумываю передать объект, похожий на сопоставление, как упоминалось выше, который накапливает значения, а не затирает их.Есть ли более простой способ предотвратить коллапс ключа/значения, который мне не хватает?Вместо того, чтобы делать сумасшедший адаптер (который может сломаться, если ConfigParserменяется реализация) должен ли я просто написать вариант ConfigParser сам?

Я чувствую, что это один из тех моментов, когда я вижу только трудные решения.

[Редактировать:] Вот более точный пример того, как я хотел бы использовать один и тот же ключ несколько раз:

[Ignored Paths]
ignore-extension: .swp
ignore-filename: tags
ignore-directory: bin

Мне не нравится синтаксис списка, разделенного запятыми, потому что он раздражает глаза, когда вы масштабируете его до многих значений;например, список из пятидесяти расширений, разделенных запятыми, будет не очень удобочитаемым.

Это было полезно?

Решение

ConfigParser не предназначен для обработки таких условий. Кроме того, ваш файл конфигурации не имеет смысла для меня.

ConfigParser дает вам структуру, похожую на dict, для каждого раздела, поэтому, когда вы вызываете parser.items (section), я ожидаю аналогичного вывода для dict.items (), который представляет собой просто список кортежей ключ / значение. Я бы никогда не ожидал увидеть что-то вроде:

[('spam', 'eggs'), ('spam', 'ham')]

Не говоря уже о том, как бы вы себя ожидали от следующих действий?

parser.get('Some Section', 'spam')

Какой предполагаемый способ получения значений.

Если вы хотите сохранить несколько значений для одного и того же ключа, я бы предложил что-то вроде этого в вашем конфигурационном файле:

[Some Section]
spam: eggs, ham

И это в вашем коде:

spam_values = [v.strip() for v in parser.get('Some Section', 'spam').split(',')]

Конечно, это будет работать только для значений, которые не содержат запятых или обрабатывают кавычки Для этого вам следует использовать более продвинутый метод (см. это и это ).

РЕДАКТИРОВАТЬ: если вы не возражаете против дополнительной зависимости, вы можете проверить ConfigObj , которая изначально поддерживает списки как тип значения.

Другие советы

Этот недостаток ConfigParser является причиной использования pyglet. исправленная версия epydoc заменить ConfigParser ini этим простой формат:

name: pyglet
url: http://www.pyglet.org/

output: html
target: doc/api/
...    
module: pyglet

exclude: pyglet.gl.gl
exclude: pyglet.gl.agl
exclude: pyglet.gl.lib_agl
exclude: pyglet.gl.wgl
...

Если вам не нужны разделы — этот подход может быть полезен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top