В чем преимущество использования ConfigParser вместо обычного файла python.py при написании файлов конфигурации? - PullRequest
7 голосов
/ 17 ноября 2010

Я уже некоторое время использую модуль ConfigParser для записи файлов конфигурации.Однако недавно меня поразила мысль;почему бы просто не использовать чистый Python вместо этого?Возьмите этот пример файла конфигурации:

[parameters]
# Host
host = stackoverflow.com
port = 22

Чтобы прочитать эти значения в мой код, я делаю

import ConfigParser
config = ConfigParser.SafeConfigParser()
config.read('host.cfg')

host = config.get('parameters', 'host')
port = config.get('parameters', 'port')

С другой стороны, если бы у меня был файл конфигурации, подобный этому:*

# Host
host = 'stackoverflow.com'
port = 22

В своем основном коде я мог бы сделать это:

from host_cfg import *

Так, что я получу от использования модуля ConfigParser?Каковы плюсы и минусы каждого подхода?

Ответы [ 3 ]

9 голосов
/ 17 ноября 2010

Итак, что я получу от использования модуля ConfigParser?

Совместимость с файлами Windows .ini.Делает некоторых людей счастливыми.

Каковы плюсы и минусы каждого подхода?

ConfigParser имеет ограниченный синтаксис, а некоторые относительно простые вещи становятся очень надуманными.Посмотрите на примеры logging.

Синтаксис Python проще и с ним гораздо проще работать.Там нет дыры в безопасности, так как никто не будет тратить время на взлом файла конфигурации, когда они могут просто взломать ваш исходный код.Действительно, они могут взломать большую часть встроенной библиотеки Python.В этом отношении они могли бы приготовить интерпретатор Python.

Никто не тратит время на взлом конфигурационных файлов, когда в исходном коде вашего приложения намного, гораздо проще использовать другие возможности.

6 голосов
/ 17 ноября 2010

ConfigParser анализирует простую плоскую конфигурацию data . Импортирование модуля Python выполняется code . Для файлов конфигурации вы хотите данные , а не код . Дело закрыто.

Хорошо, более подробно: код может делать любые вещи, в том числе более легко ломаться - особенно при редактировании непрограммистами (попробуйте объяснить модерам .ini, что они, например, должны использовать соответствующие кавычки и экранировать вещи ...) - или вызвать конфликт пространства имен с другими частями вашего приложения (особенно если вы import *). Также см. правило наименьшей силы .

4 голосов
/ 17 ноября 2010

Потенциальным «минусом» подхода с использованием файлов Python является то, что ваш пользователь может поместить в файл произвольный код, который будет выполняться в контексте вашего приложения. Как указывает С.Лотт в комментариях к этому ответу (когда я был несколько более настойчивым в своем предупреждении), это обычно не проблема, потому что пользователь (или хакер) обычно все равно будет иметь доступ ко всему исходному коду и может внести любые желаемые изменения.

Однако я, конечно, могу представить себе ситуации, в которых такой подход может привести к появлению новой дыры в безопасности, например, когда основные файлы сценариев доступны для записи только системному администратору, а файл конфигурации для каждого пользователя является единственным файлом, редактируемым конечный пользователь. Если вы не уверены, что ваш код никогда не будет работать в такой среде, я бы не рекомендовал модульный подход Python. Существуют веские причины, по которым «не выполнять код, предоставленный вам пользователями», широко считается лучшей практикой.

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

Если, несмотря на все это, вы все еще хотите использовать синтаксис Python в своем конфигурационном файле, вы можете использовать модуль ast (см. Функцию literal_eval()).

...