긴 상수 목록을 Python 파일로 가져 오기


90

파이썬에서 다음 C과 같은 전 처리기 문장 의 유사점이 있습니까? :

#define MY_CONSTANT 50

또한 여러 클래스로 가져오고 싶은 많은 상수 목록이 있습니다. .py파일 에서 위와 같은 긴 명령문 시퀀스로 상수를 선언하고 다른 .py파일로 가져 오는 아날로그가 있습니까?

편집하다.

파일 Constants.py은 다음과 같습니다.

#!/usr/bin/env python
# encoding: utf-8
"""
Constants.py
"""

MY_CONSTANT_ONE = 50
MY_CONSTANT_TWO = 51

그리고 myExample.py읽습니다.

#!/usr/bin/env python
# encoding: utf-8
"""
myExample.py
"""

import sys
import os

import Constants

class myExample:
    def __init__(self):
        self.someValueOne = Constants.MY_CONSTANT_ONE + 1
        self.someValueTwo = Constants.MY_CONSTANT_TWO + 1

if __name__ == '__main__':
    x = MyClass()

편집하다.

컴파일러에서

NameError : "글로벌 이름 'MY_CONSTANT_ONE'이 정의되지 않았습니다."

myExample의 함수 초기화 13 번째 줄 self.someValueOne = Constants.MY_CONSTANT_ONE + 1 copy output 프로그램이 0.06 초 후에 코드 # 1로 종료되었습니다.


2
아니요, 전처리 기가 없습니다. 그리고 아니, 파이썬에서 C를 코딩하려고 시도하거나 심지어 유사점을 찾으려고 시도하지 않을 것입니다.

그것은 완전한 역 추적이 아닙니다. 어떻게 실행하고 있습니까? python myExample.py파일 이름과 <module>최상위 레벨 을 포함하는 오류에 대한 추적을 제공해야 합니다. 또한, 글로벌 이름으로 언급 MY_CONSTANT_ONE 되지 않습니다 . 정말 이상합니다. 이것이 실제로 실행중인 파일인지 세 번 확인합니다 (아마도 ASCII로 변환하고 # encoding: utf8비트를 제거 ).

@All : 고마워요, 지금은 괜찮은 것 같습니다-아직 이유는 모르겠지만 신경 쓰지 마세요 :).
SK9

답변:


132

Python은 전처리되지 않습니다. 파일을 만들 수 있습니다 myconstants.py.

MY_CONSTANT = 50

그리고 그것들을 가져 오면 작동합니다.

import myconstants
print myconstants.MY_CONSTANT * 2

@ SK9 : 실행중인 정확한 코드를 보여주세요 (모듈 정의 및 사용 모두).

@Thomas : 위 참조. 나는 기초를 배우는 동안 어떤 멍청한 것을 확실히 놓쳤다.
SK9

@ SK9 : 게시 한 코드에는 이러한 오류가 없습니다. 여러 번 확인하고 직접 실행했는데 잘 작동합니다. 그것은 할 수없는 경우에도 (이름에 대한 참조가 없습니다이 오류가 발생할 MAX_FIVE_FLUSH_KEY_INT). 트레이스 백을 게시하십시오.

@Thomas : 테스트 해 주셔서 감사합니다. 흠, 다시 해보겠습니다. (언급 된 참조는 오타입니다.) 파일을 그대로 사용해 보셨습니까? (위의 전체 내용을 복사하여 붙여 넣었습니다.)
SK9

@ SK9 : 저는 Thomas가 아닙니다.) 그리고 예, 모든 것을 복사하여 붙여 넣었고 파일 이름도 그대로 두었습니다. 다시, 트레이스 백은 디버깅에 도움이 될 것입니다.

18

파이썬에는 전처리 기가없고 변경할 수 없다는 의미의 상수도 없습니다. 항상 변경할 수 있습니다 (거의 상수 객체 속성을 에뮬레이션 할 수 있지만 상수 성을 위해이 작업을 수행하는 경우는 거의 없습니다). 완료되고 유용하지 않은 것으로 간주 됨) 모든 것. 상수를 정의 할 때, 우리는 이름을 밑줄이있는 대문자로 정의하고 "우리는 모두 여기서 성인에 동의합니다"라고 부릅니다. 정상적인 사람은 상수를 변경할 수 없습니다. 물론 그가 아주 타당한 이유가 있고 그가 무엇을하고 있는지 정확히 알고 있지 않는 한, 어떤 경우에도 그를 막을 수 없습니다 (그리고 합당하게도 안됩니다).

그러나 물론 값으로 모듈 수준 이름을 정의하고 다른 모듈에서 사용할 수 있습니다. 이것은 상수 나 다른 것에 국한되지 않으며 모듈 시스템에서 읽습니다.

# a.py
MY_CONSTANT = ...

# b.py
import a
print a.MY_CONSTANT

11

물론 다음을 수행 할 수 있습니다.

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT


3
import *는 일반적으로 권장되지 않지만 코드베이스에서 널리 사용되는 C 스타일 매니페스트 상수는 그것을 사용하는 것이 제정신이 아닌 곳 중 하나입니다. ALL_CAPS 또는 다른 기호와의 충돌 가능성을 줄이는 접두사 규칙으로 이름을 지정하면 관용구에 대한 주된 이의가 제거되며 충돌이 발생하면 항상 기존 가져 오기 + 명시 적 이름 스타일 (import a; a .MY_CONSTNAT), C와는 달리
Russell Borogove

또한 a.MY_CONSTNAT가 약간 느립니다. 그 이유는 인터프리터가 하나의 네임 스페이스에서 'a'라는 이름을 찾고 두 번째 하나의 적 이름 'MY_CONSTNAT'에서 검색하기 때문입니다
tony

7

물론 상수를 별도의 모듈에 넣을 수 있습니다. 예를 들면 :

const.py :

A = 12
B = 'abc'
C = 1.2

main.py :

import const

print const.A, const.B, const.C

위의 선언, 참고 A, B하고 C있는 변수, 즉 런타임에 변경 될 수 있습니다.


5

"설정"모듈을 사용하여 상수 만들기 를 보 시겠습니까? 수 있습니까 방지 파이썬에서 객체를 수정?

또 다른 유용한 링크 : http://code.activestate.com/recipes/65207-constants-in-python/ 은 다음 옵션에 대해 알려줍니다.

from copy import deepcopy

class const(object):

    def __setattr__(self, name, value):
        if self.__dict__.has_key(name):
            print 'NO WAY this is a const' # put here anything you want(throw exc and etc)
            return deepcopy(self.__dict__[name])
        self.__dict__[name] = value

    def __getattr__(self, name, value):
        if self.__dict__.has_key(name):
            return deepcopy(self.__dict__[name])

    def __delattr__(self, item):
        if self.__dict__.has_key(item):
            print 'NOOOOO' # throw exception if needed

CONST = const()
CONST.Constant1 = 111
CONST.Constant1 = 12
print a.Constant1 # 111
CONST.Constant2 = 'tst'
CONST.Constant2 = 'tst1'
print a.Constant2 # 'tst'

따라서 이와 같은 클래스를 만든 다음 contants.py 모듈에서 가져올 수 있습니다. 이렇게하면 값이 변경되거나 삭제되지 않는지 확인할 수 있습니다.


감사합니다. 그래서 물어보기 전에 두 가지를 모두 검색하고 찾았습니다. :)
SK9

@ SK9 오, 중복 죄송합니다
Artsiom Rudzenka 2011-06-14

4

몇 가지 답변에 설명 된 가져 오기 접근 방식을 사용하는 대신 configparser 모듈을 .

ConfigParser 클래스는 Microsoft Windows INI 파일에서 찾을 수있는 것과 유사한 구조를 제공하는 기본 구성 파일 파서 언어를 구현합니다. 이를 사용하여 최종 사용자가 쉽게 사용자 정의 할 수있는 Python 프로그램을 작성할 수 있습니다.


2

상수처럼 보이는 변수뿐만 아니라 상수를 정말로 원한다면 불변의 사전을 사용하는 것이 표준 방법입니다. 안타깝게도 아직 내장되어 있지 않으므로 타사 레시피 (예 : 이것 또는 저것 ) 를 사용해야 합니다.


2

my_constants.py와 같은 이름으로 상수 파일을 만드십시오.

CONSTANT_NAME = "SOME VALUE"

코드 가져 오기 파일에서 상수에 액세스하려면

import my_constants as constant

다음과 같이 상수 값에 액세스하십시오.

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