Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
У Вас есть две достойных опции:
, стандартные конфигурационные файлы 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 дает Вам больше гибкости в будущем, если Ваши потребности расширяются.
Всего наилучшего
Я иногда просто пишу модуль Python (т.е. файл) названный config.py
или что-то со следующим содержанием:
config = {
'name': 'hello',
'see?': 'world'
}
это может тогда быть 'считано' как так:
from config import config
config['name']
config['see?']
легкий.
Я услышал, что ConfigObj легче работать с, чем ConfigParser. Это используется большим количеством больших проектов, IPython, Trac, Turbogears, и т.д.
От их введение :
ConfigObj является простым, но мощным средством чтения файла конфигурации и устройством записи: ini файл круглый экскурсант. Его основная функция - то, что это очень просто в использовании с интерфейсом простого программиста и простым синтаксисом для файлов конфигурации. Это имеет много других функций хотя:
Я думаю, что Вы хотите модуль ConfigParser в стандартной библиотеке. Это читает и пишет файлы стиля INI. Примеры и документация в стандартной документации, с которой я связался, являются очень всесторонними.
Если Вы - единственный, который имеет доступ к конфигурационному файлу, можно использовать простое, решение низкого уровня. Сохраните "словарь" в текстовом файле как список кортежей (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, сообщение). Я обычно делаю как предложенный 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 делает с их файлом настроек, между прочим.