"설정"모듈을 사용하여 상수를 만드시겠습니까?


78

저는 비교적 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파일에 저와 같은 이름의 상수 가 있음을 알았습니다 . 스크립트로 가져오고 응용 프로그램을 통해 참조 할 수있는 방법에 대해 혼란 스럽습니다.

편집하다

모든 답변에 감사드립니다! 다음을 시도했습니다.

import settings

print settings.CONSTANT

같은 오류가 발생합니다

ImportError: cannot import name CONSTANT


5
말이 안 돼. 당신은을 얻는해야 AttributeError하는 경우 settings정의하지 않습니다 CONSTANT하고는 ImportError이 설정을 가져올 수없는 경우,이 경우조차 보지 것CONSTANT
aaronasterling

내가 뭘 잘못하고 있니?
Lark

1
마지막으로 게시 한 두 줄을 게시 한 그대로 파일에 직접 넣고 작동하는지 확인합니다.
aaronasterling

1
모든 도움에 감사드립니다. 나는 그것을 알아. init .py 파일 의 배치와 관련이 있습니다. 나는 설정을 가져 오려고했기 때문에 파이썬이 그것을 찾을 수 없었기 때문에 "모듈"디렉토리 설정을 참조하면 모든 것이 제대로 작동했습니다. 따라서 기본적으로 내 import 문은 다음과 같습니다. from modules import settings. 이 작업을 수행하는 더 좋은 방법, 더 비단뱀 같은 방법이 있다고 생각하므로 다른 조합을 시도해 보겠습니다. 모든 답변에 다시 한 번 감사드립니다.
Lark

답변:


140

가장 쉬운 방법은 설정을 모듈로 만드는 것입니다.

(settings.py)

CONSTANT1 = "value1"
CONSTANT2 = "value2"

(consumer.py)

import settings

print settings.CONSTANT1
print settings.CONSTANT2

파이썬 모듈을 가져올 때 모듈 이름을 가져 오는 변수 앞에 접두사를 붙여야합니다. 주어진 파일에서 사용하려는 값을 정확히 알고 있고 실행 중에 변경되는 것에 대해 걱정하지 않는다면 다음을 수행 할 수 있습니다.

from settings import CONSTANT1, CONSTANT2

print CONSTANT1
print CONSTANT2

그러나 나는 그 마지막 것에 휩쓸 리지 않을 것입니다. 코드를 읽는 사람들이 값의 출처를 파악하기 어렵게 만듭니다. 다른 클라이언트 모듈이 값을 변경하면 해당 값이 업데이트되지 않도록합니다. 이를 수행하는 마지막 방법은

import settings as s

print s.CONSTANT1
print s.CONSTANT2

이렇게하면 입력을 절약하고 업데이트를 전파하며 독자 만 s설정 모듈에서 가져온 내용 임을 기억하면 됩니다.


내가 특별히 사용되지 않는 답변을하지에 관한 메커니즘을 언급 피했다 @delnan)
aaronasterling

글쎄, 실질적으로 쓸모없는;) 정확한 의미를 아는 것이 유용하고 바람직하지만 작동하도록 만들기 위해 필요하지 않습니다. 그의 의미를 알아야 할 필요가 있지만 대답에 거의 요약되어 있습니다.

3
상수에 대한 아이디어는 런타임에 변경할 수 없다는 것입니까?
Lie Ryan

1
@Lie Ryan, Python에는 상수가 없습니다. 멀티 프로그래머 프로젝트에서는 결코 알 수 없습니다.
aaronasterling

1
@AaronMcSmoot : 예,하지만 런타임 후에 상수를 변경하려는 의도가있는 경우에는 잘못된 디자인을 가지고있는 것으로 의심됩니다.
Lie Ryan

17

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

도움이 되었기를 바랍니다.


5

당신이 때 import settings하는 module라는 개체가 settings전역 네임 스페이스에 배치됩니다 -이 객체가 수행하는이 있었다있다 settings.py속성과. 즉 외부의 settings.py, 당신은 참조 CONSTANTsettings.CONSTANT.


4

settings.py를 그대로두면 Django처럼 사용할 수 있습니다.

import settings

def func():
    var = settings.CONSTANT

3

당신이 경우 ... 아니면 정말 settings.py에서 모든 상수는 전역 네임 스페이스로 가져올 수 싶어, 당신은 실행할 수 있습니다

from settings import *

...하지만 다른 settings.CONSTANT모든 사람들이 여기서 언급했듯이를 사용하는 것은 매우 옳습니다.


import진술 을 사용하는 세 가지 가능한 방법에 대한 내 대답을 참조하십시오 .
aaronasterling

2
실제로 이것은 바람직하지 않습니다. 예를 들어 docs.python.org/howto/doanddont.html#from-module-import를 참조하십시오 . 이 경우 상수 변경이 다른 모듈에 영향을 미치지 않는 적절한 부작용이 있지만.

2
@AaronMcSmooth라고 멋지게 말했습니다. 그리고 기술적으로 나는 수입하는 것이 좋습니다이었다 말하지 않았다 *, 그것은 가능했다 그냥 : P
ewall

@delnan. 그게 바람직한 지 잘 모르겠습니다. 응용 프로그램에 따라 다르지만 변경 사항이 전파되어야 할 가능성도 있습니다 (발생하더라도)
aaronasterling


2

나는 파이썬에서 처음이지만 setings.py의 함수와 같은 상수를 정의하면

def CONST1():
    return "some value"

main.py

import setings

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

여기서는 값을 변경할 수 없지만 기능처럼 작동합니다.


2

이 방법은 설정 변수를 한 번만로드 / 평가하기 때문에 더 효율적입니다. 내 모든 Python 프로젝트에서 잘 작동합니다.

pip install python-settings

여기 문서 : https://github.com/charlsagente/python-settings

다음과 같이 정의 된 모든 상수가 포함 된 settings.py 파일이 필요합니다.

# settings.py

DATABASE_HOST = '10.0.0.1'

그런 다음 환경 변수 (내보내기 SETTINGS_MODULE = settings)를 설정하거나 configure 메서드를 수동으로 호출해야합니다.

# something_else.py

from python_settings import settings
from . import settings as my_local_settings

settings.configure(my_local_settings) # configure() receives a python module

이 유틸리티는 무거운 객체를로드하기위한 지연 초기화도 지원하므로 Python 프로젝트를 실행할 때 필요할 때만 설정 변수를 평가하므로로드 속도가 더 빠릅니다.

# settings.py

from python_settings import LazySetting
from my_awesome_library import HeavyInitializationClass # Heavy to initialize object

LAZY_INITIALIZATION = LazySetting(HeavyInitializationClass, "127.0.0.1:4222") 
# LazySetting(Class, *args, **kwargs)

한 번만 구성하고 이제 필요한 곳에 변수를 호출하십시오.

# my_awesome_file.py

from python_settings import settings 

print(settings.DATABASE_HOST) # Will print '10.0.0.1'

1

이 시도:

settings.py에서 :

CONSTANT = 5

기본 파일에서 :

from settings import CONSTANT

class A:
    b = CONSTANT

    def printb(self):
         print self.b

위의 오류는 설정 파일을 너무 늦게 가져 오기 때문에 발생하는 것 같습니다. 파일 상단에 있는지 확인하세요.


1

체크 아웃 할 가치가있는 것은 runtim에서 스크립트에 설정을 제공 할 수 있는 간단한 설정 프로젝트로, 환경 별 설정 (dev, test, prod 등을 생각해보십시오)을 허용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.