Конфигурационный файл со списком пар "ключ-значение" в Python

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

25
задан Mike Pennington 12 October 2012 в 09:22
поделиться

6 ответов

У Вас есть две достойных опции:

  1. формат файла конфигурации стандарта Python с помощью [1 110] ConfigParser
  2. YAML, пользующийся библиотекой как [1 112] PyYAML

, стандартные конфигурационные файлы Python похожи на файлы INI с [sections] и key : value или key = value пары. Преимущества для этого формата:

  • Никакие сторонние библиотеки, необходимые
  • Простой, знакомый формат файла.

YAML отличается в этом, он разработан, чтобы быть человеческим дружественным форматом сериализации данных, а не специально предназначенный для конфигурации. Это очень читаемо и дает Вам пару различных способов представить те же данные. Для Вашей проблемы Вы могли создать файл YAML, который похож на это:

file .* does not exist : file not found
user .* not found : authorization error

Или как это:

{ file .* does not exist: file not found,
  user .* not found: authorization error }

Используя PyYAML не могло быть более простым:

import yaml

errors = yaml.load(open('my.yaml'))

В этой точке errors словарь Python с ожидаемым форматом. YAML способен к представлению больше, чем словари: если Вы предпочитаете список пар, используйте этот формат:

-
  - file .* does not exist 
  - file not found
-
  - user .* not found
  - authorization error

Или

[ [file .* does not exist, file not found],
  [user .* not found, authorization error]]

, Который произведет список списков, когда yaml.load будет назван.

Одно преимущество YAML состоит в том, что Вы могли использовать его для экспорта существующих, трудно кодированных данных в файл для создания начальной версии, а не сократить/вставить плюс набор, находят/заменяют для получения данных в правильный формат.

формат YAML займет немного больше времени, чтобы познакомиться с, но использование, PyYAML еще более прост, чем использование ConfigParser с преимуществом, состоит в том, что у Вас есть больше опций относительно того, как Ваши данные представлены с помощью YAML.

Любой кажется, что будет соответствовать Вашим текущим потребностям, ConfigParser будет легче запустить с того, в то время как YAML дает Вам больше гибкости в будущем, если Ваши потребности расширяются.

Всего наилучшего

36
ответ дан Aaron Hays 28 November 2019 в 17:45
поделиться

Я иногда просто пишу модуль Python (т.е. файл) названный config.py или что-то со следующим содержанием:

config = {
    'name': 'hello',
    'see?': 'world'
}

это может тогда быть 'считано' как так:

from config import config
config['name']
config['see?']

легкий.

38
ответ дан Daren Thomas 28 November 2019 в 17:45
поделиться

Я услышал, что ConfigObj легче работать с, чем ConfigParser. Это используется большим количеством больших проектов, IPython, Trac, Turbogears, и т.д.

От их введение :

ConfigObj является простым, но мощным средством чтения файла конфигурации и устройством записи: ini файл круглый экскурсант. Его основная функция - то, что это очень просто в использовании с интерфейсом простого программиста и простым синтаксисом для файлов конфигурации. Это имеет много других функций хотя:

  • Вложенные разделы (подразделы), к любым значениям Списка уровня
  • Несколько значений строки
  • Строковая интерполяция (замена)
  • Интегрированный с мощной системой проверки
    • включая автоматическую проверку/преобразование типа
    • повторные разделы
    • и значения по умолчанию разрешения
  • При выписывании файлов конфигурации, ConfigObj сохраняет все комментарии и порядок участников и разделяет
  • Много полезных методов и опций для работы с конфигурационными файлами (как метод 'перезагрузки')
  • Полная поддержка Unicode
8
ответ дан sheats 28 November 2019 в 17:45
поделиться

Я думаю, что Вы хотите модуль ConfigParser в стандартной библиотеке. Это читает и пишет файлы стиля INI. Примеры и документация в стандартной документации, с которой я связался, являются очень всесторонними.

4
ответ дан Andrew Wilkinson 28 November 2019 в 17:45
поделиться

Если Вы - единственный, который имеет доступ к конфигурационному файлу, можно использовать простое, решение низкого уровня. Сохраните "словарь" в текстовом файле как список кортежей (regexp, сообщение) точно, как будто это было выражение Python:

[
("file .* does not exist", "file not found"),
("user .* not authorized", "authorization error")
]
В Вашем коде, загрузите его, затем оценка это, и скомпилируйте regexps в результате:
f = open("messages.py")
messages = eval(f.read()) # caution: you must be sure of what's in that file
f.close()
messages = [(re.compile(r), m) for (r,m) in messages]
и Вы заканчиваете со списком кортежей (compiled_regexp, сообщение).
4
ответ дан Federico A. Ramponi 28 November 2019 в 17:45
поделиться

Я обычно делаю как предложенный Daren, просто делаю Ваш файл конфигурации сценарием Python:

patterns = {
    'file .* does not exist': 'file not found',
    'user .* not found': 'authorization error',
}

Тогда можно использовать его как:

import config

for pattern in config.patterns:
    if re.search(pattern, log_message):
        print config.patterns[pattern]

Это - то, что Django делает с их файлом настроек, между прочим.

3
ответ дан davidavr 28 November 2019 в 17:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: