Создать константы с помощью модуля настроек?

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

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

settings.py

CONSTANT = 'value'

script.py

import settings

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

Я получаю сообщение об ошибке Python:

global name 'CONSTANT' is not defined.

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

EDIT

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

import settings

print settings.CONSTANT

Я получаю ту же ошибку

ImportError: cannot import name CONSTANT

Ответ 1

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

(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 из модуля настроек.

Ответ 2

шаг 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

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

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

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

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

Ответ 3

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

Ответ 4

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

import settings

def func():
    var = settings.CONSTANT

Ответ 5

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

Ответ 6

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

from settings import *

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

Ответ 7

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

def CONST1():
    return "some value"

main.py

import setings

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

здесь я вижу только один, значение can not be changed, но его работа как функция.

Ответ 8

Попробуйте следующее:

В settings.py:

CONSTANT = 5

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

from settings import CONSTANT

class A:
    b = CONSTANT

    def printb(self):
         print self.b

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

Ответ 9

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