Ответ 1
Зависит от преобладающей целевой аудитории.
Если это программисты, которые все равно меняют файл, просто используйте файлы python, такие как settings.py
Если это конечные пользователи, подумайте о файлах ini.
Django использует реальные файлы Python для настроек, Trac использует .ini файл, а некоторые другие части программного обеспечения используют XML файлы для хранения этой информации.
Есть ли один из этих подходов, благословленный Гвидо и/или сообществом Python больше, чем другой?
Зависит от преобладающей целевой аудитории.
Если это программисты, которые все равно меняют файл, просто используйте файлы python, такие как settings.py
Если это конечные пользователи, подумайте о файлах ini.
Как говорили многие, нет "официального" способа. Однако есть много вариантов. В этом году была обсуждена беседа в PyCon о многих доступных вариантах.
Я использую полку (http://docs.python.org/library/shelve.html):
shelf = shelve.open(filename)
shelf["users"] = ["David", "Abraham"]
shelf.sync() # Save
Не знаю, можно ли считать это "официальным", но он находится в стандартной библиотеке: 14.2. ConfigParser - синтаксический анализатор файла конфигурации.
Это, очевидно, не универсальное решение. Просто используйте то, что считает наиболее подходящим для задачи, без какой-либо необходимой сложности (и, особенно, - Turing-полнота! Подумайте о автоматических или графических конфигураторах).
Еще один вариант, PyQt. Qt имеет независимый от платформы способ хранения настроек с классом QSettings. Под капотом, в окнах используется реестр, а в Linux он сохраняет настройки в скрытом файле conf. QSettings работает очень хорошо и довольно безвредно.
Я не уверен, что существует "официальный" способ (он не упоминается в Zen of Python:)). Я обычно использую модуль Config Parser, и я думаю, что вы найдете это довольно распространенным. Я предпочитаю, что над файловым подходом python, потому что вы можете написать обратно и динамически перезагрузить, если хотите.
Насколько я знаю, нет благословенного решения. Нет правильного или неправильного способа хранения настроек приложения, ни файлы xml, json, ни все типы файлов не прекращаются до тех пор, пока вы будете с ними комфортно. Для python я лично использую pypref, это очень просто, кросс-платформенный и простой.
pypref очень полезен, поскольку можно хранить статические и динамические настройки и настройки...
from pypref import Preferences
# create singleton preferences instance
pref = Preferences(filename="preferences_test.py")
# create preferences dict
pdict = {'preference 1': 1, 12345: 'I am a number'}
# set preferences. This would automatically create preferences_test.py
# in your home directory. Go and check it.
pref.set_preferences(pdict)
# lets update the preferences. This would automatically update
# preferences_test.py file, you can verify that.
pref.update_preferences({'preference 1': 2})
# lets get some preferences. This would return the value of the preference if
# it is defined or default value if it is not.
print pref.get('preference 1')
# In some cases we must use raw strings. This is most likely needed when
# working with paths in a windows systems or when a preference includes
# especial characters. That how to do it ...
pref.update_preferences({'my path': " r'C:\Users\Me\Desktop' "})
# Sometimes preferences to change dynamically or to be evaluated real time.
# This also can be done by using dynamic property. In this example password
# generator preference is set using uuid module. dynamic dictionary
# must include all modules name that must be imported upon evaluating
# a dynamic preference
pre = {'password generator': "str(uuid.uuid1())"}
dyn = {'password generator': ['uuid',]}
pref.update_preferences(preferences=pre, dynamic=dyn)
# lets pull 'password generator' preferences twice and notice how
# passwords are different at every pull
print pref.get('password generator')
print pref.get('password generator')
# those preferences can be accessed later. Let simulate that by creating
# another preferences instances which will automatically detect the
# existance of a preferences file and connect to it
newPref = Preferences(filename="preferences_test.py")
# let print 'my path' preference
print newPref.get('my path')
В значительной степени это зависит от того, насколько сложна ваша конфигурация. Если вы делаете простое сопоставление ключей и значений, и вы хотите изменить настройки с помощью текстового редактора, я думаю, что ConfigParser - это путь.
Если ваши настройки сложны и включают списки и вложенные структуры данных, я бы использовал XML или JSON и создал редактор конфигурации.
Для действительно сложных вещей, когда конечный пользователь не должен сильно изменять настройки или более доверен, просто создайте набор классов Python и оцените Python script, чтобы получить конфигурацию.
Для веб-приложений мне нравится использовать переменные среды ОС: os.environ.get('CONFIG_OPTION')
Это особенно хорошо работает для настроек, которые различаются между развертываниями. Вы можете узнать больше об обосновании использования env vars здесь: http://www.12factor.net/config
Конечно, это работает только для значений только для чтения, потому что изменения в среде обычно не являются постоянными. Но если вам не нужен доступ на запись, это очень хорошее решение.
почему Гвидо благословил что-то, что выходит за рамки его? Нет ничего особого благословения.
Одним из самых простых способов использования является использование модуля json
.
Сохраните файл в config.json
с информацией, как показано ниже.
Сохранение данных в json файле:
{
"john" : {
"number" : "948075049" ,
"password":"thisisit"
}
}
Чтение из json файла:
import json
#open the config.json file
with open('config.json') as f:
mydata = json.load(f) ;
#Now mydata is a python dictionary
print("username is " , mydata.get('john').get('number') , " password is " , mydata.get('john').get('password')) ;
Это больше удобно. Официального способа говорить нельзя. Но использование XML файлов имело бы смысл, поскольку их можно было манипулировать различными другими приложениями/библиотеками.