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

파이썬에서 다음 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로 종료되었습니다.



답변

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

MY_CONSTANT = 50

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

import myconstants
print myconstants.MY_CONSTANT * 2


답변

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

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

# a.py
MY_CONSTANT = ...

# b.py
import a
print a.MY_CONSTANT


답변

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

# a.py
MY_CONSTANT = ...

# b.py
from a import *
print MY_CONSTANT


답변

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

const.py :

A = 12
B = 'abc'
C = 1.2

main.py :

import const

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

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


답변

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

또 다른 유용한 링크 : 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 모듈에서 가져올 수 있습니다. 이렇게하면 값이 변경되거나 삭제되지 않는지 확인할 수 있습니다.


답변

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

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


답변

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