Найти - Пользователи
Полная версия: Проблема импорта
Начало » Python для новичков » Проблема импорта
1 2
Fre
вот кусок кода
f=open('pica/data/pica.conf', 'r')
f2=open('conffile.py', 'w')
f2.write(f.read())
f2.close()
f.close()
import conffile
print PICA_LOG_FILE
в conffile у меня просто набор переменных
навроде
PICA_CACHE_DIR="/var/pica/cache"
PICA_TEST_DIR="var/pica/tests"

Почему после импорта, при попытке вывести на экран переменную, вылетает ошибка
*переменная* is not defined
что я неправильно сделал?
Soteric
Потому что область видимости переменной PICA_LOG_FILE ограничивается модулем conffile?
Fre
отлично, это можно как то исправить? или прийдется решать задачу иначе?
reclosedev
Python Tutorial. 6. Modules
Т.е. можно написать:
import conffile
print conffile.PICA_LOG_FILE
или
from conffile import PICA_LOG_FILE
print PICA_LOG_FILE
на самый крайний случай
from conffile import *
print PICA_LOG_FILE
Soteric
Можно попробовать
print conffile.PICA_LOG_FILE
но вообще какой-то сомнительный способ читать конфигурацию. Можно попробовать воспользоваться модулем ConfigParser.
beelze
Вообще очень имеет смысл написать свой класс - унаследовать хотя бы от упомянутого ConfigParser и реализовать в нем основной функционал - значения по умолчанию, проверка на существование обязательных параметров, проверка значения параметров итд. Конфиг по определению редактируем, и, соответственно, может содержать ошибочные или просто несоответствующие реалиям значения. Отлавливать это когда-нибудь потом - занудно и непроизводительно; стоит использовать примерно такую парадигму: “объект конфига с неверными значениями создан быть не может”, то есть в созданном объекте конфига все параметры имеют такие значения, которые не нарушат функционирование основного кода.
doza_and
Soteric
сомнительный способ читать конфигурацию

Может не такой уж и плохой способ задать конфиграцию

импорт :i ConfigParser:c
проверка возможно - вложением импорта возможно - наследованием
задание циклов и т.п. i:+ c:-
макроподстановки i:- c:+
многострочные литералы i:+ c:-
кроссязычность :) i:- c:+
Синглетонное поведение i:+ c:-
Упрощенный синтаксис i:from config import * c:-
поиск файла!!! i:по PYTHONPATH c:-
запись файла конфига i: - c:+
безопасность i:- c:+
комментирование i:+ C:+

Заполняемый человеком конфиг (т.е. конфиг только для чтения) в большом проекте раскиданном по множеству директорий удобнее выполнить с использованием импортирования.

ConfigParser нужен когда нужно разделение конфигурации между компонентами на разных языках (я предпочитаю json или hdf5 форматы но в конфиге большой плюс можно чтото закомментировать!!!). Когда конфигурация много раз непредсказуемо меняется программой (такой вид персистентности обеспечивает pickle или базы данных).
beelze
doza_and, многострочные литералы c:+ все таки. А зачем в конфиге циклы? Может весчь нужная а я не в курсе

безопасность i: приемлема только на уровне примеров для изучающих язык. Ибо это не дырка в этом смысле а звездные врата какие-то
reclosedev
Мне нравится как предложено в Flask - Configuring from Files
Т.е. настройки из обычных Python файлов можно переопределить текстовыми конфигми.

В десктоп проектах показались удобными JSON, Yaml или стандартные средства гуи тулкита, например QSettings в Qt.
beelze
В любом случае как минимум 2 большие разницы в околоконфижных вопросах есть между редактируемыми в текстовом редакторе конфигами и редактируемыми в собственно приложении; что и должно определять выбор средств на начальном этапе.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB