Создавать константы с помощью модуля «Настройки»? - PullRequest
73 голосов
/ 29 сентября 2010

Я провел поиск в Google и здесь, в Stackoverflow, но не могу найти то, что ищу.

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

Вот как я хочу настроить мой код

settings.py

CONSTANT = 'value'

script.py

import settings

def func():
    var = CONSTANT
    --- do some more coding ---
    return var

Я получаю ошибку Python, сообщающую: «глобальное имя« CONSTANT »не определено.

Я заметил в исходном коде Django их файл settings.pyимеет константы, названные так же, как и я. Я запутался в том, как их можно импортировать в сценарий и ссылаться через приложение.

РЕДАКТИРОВАТЬ

Спасибо за все вашиответы! Я попробовал следующее:

import settings

print settings.CONSTANT

Я получаю ту же ошибку: ImportError: невозможно импортировать имя CONSTANT

Ответы [ 9 ]

129 голосов
/ 29 сентября 2010

Самый простой способ сделать это - просто иметь настройки в качестве модуля.

(settings.py)

CONSTANT1 = "value1"
CONSTANT2 = "value2"

(consumer.py)

import settings

print settings.CONSTANT1
print settings.CONSTANT2

Когда вы импортируете модуль Python, вы должны поставить перед переменными, которые вы извлекаете из него, имя модуля. Если вы точно знаете, какие значения вы хотите использовать из него в данном файле и , вы не беспокоитесь об их изменении во время выполнения, тогда вы можете сделать

from settings import CONSTANT1, CONSTANT2

print CONSTANT1
print CONSTANT2

но я бы не стал увлекаться этим последним. Людям, читающим ваш код, трудно определить, откуда поступают значения. и исключает обновление этих значений, если их изменяет другой клиентский модуль. Последний способ сделать это -

import settings as s

print s.CONSTANT1
print s.CONSTANT2

Это спасает вас от печатания, распространяет обновления и требует только, чтобы читатели помнили, что что-либо после s поступает из модуля настроек.

16 голосов
/ 03 июня 2013

шаг 1: создайте новый файл settings.py в том же каталоге для более легкого доступа.

#database configuration settings

database = dict(
    DATABASE = "mysql",
    USER     = "Lark",
    PASS     = ""
)

#application predefined constants

app = dict(
    VERSION   = 1.0,
    GITHUB    = "{url}"
)

шаг 2: импорт модуля настроек в файл приложения.

import settings as s            # s is aliasing settings & settings is the actual file you do not have to add .py 

print(s.database['DATABASE'])   # should output mysql

print(s.app['VERSION'])         # should output 1.0

, если вам не нравится использовать псевдонимы типа s, вы можете использовать другой синтаксис

from settings import database, app

print(database['DATABASE'])   # should output mysql

print(app['VERSION'])         # should output 1.0

обратите внимание на второй метод импорта, вы можете использовать имена диктов напрямую

Небольшой совет вы можете импортировать все код файла настроек с помощью *, если у вас большой файл, и вы будете использовать большинство настроек в нем в своем приложении

from settings import *      # * represent all the code on the file, it will work like step 2


print(database['USER'])       # should output lark

print(app['VERSION'])         # should output 1.0

, надеюсь, это поможет.

5 голосов
/ 29 сентября 2010

Когда вы import settings, объект module с именем settings помещается в глобальное пространство имен - и этот объект содержит атрибут, который был в settings.py как атрибуты. То есть за пределами settings.py вы ссылаетесь на CONSTANT как settings.CONSTANT.

3 голосов
/ 30 сентября 2010

См. Ответ, который я отправил на Можно ли запретить изменение объекта в Python? , который делает то, что вам нужно (а также принудительно использует идентификаторы UPPERCASE). На самом деле это может быть лучший ответ на этот вопрос, чем на другой.

3 голосов
/ 29 сентября 2010

Оставьте ваши settings.py такими, какие они есть, тогда вы можете использовать их так же, как это делает Django:

import settings

def func():
    var = settings.CONSTANT
2 голосов
/ 15 апреля 2013

Я новичок в Python, но если мы определим константу как функцию на setings.py

def CONST1():
    return "some value"

main.py

import setings

print setings.CONST1() ##take an constant value

здесь я вижу только одно, значение не может быть изменено, но оно работает как функция ..

2 голосов
/ 29 сентября 2010

... Или, если вы действительно хотите, чтобы все константы из settings.py были импортированы в глобальное пространство имен, вы можете запустить

from settings import *

... но иначеиспользование settings.CONSTANT, как все остальные упоминали здесь, совершенно правильно.

1 голос
/ 30 сентября 2010

Попробуйте это:

In settings.py:

CONSTANT = 5

В вашем основном файле:

from settings import CONSTANT

class A:
    b = CONSTANT

    def printb(self):
         print self.b

Я думаю, что ваша ошибка исходит из настроекфайл импортируется слишком поздно.Убедитесь, что это вверху файла.

0 голосов
/ 14 августа 2017

Также стоит обратить внимание на проект simple-settings , который позволяет вам вводить настройки в ваш скрипт при runtim, который учитывает специфичные для среды настройки (думаю, dev, test, prod, ... )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...