HOWTO · Python

Python의 상수

UPPER_CASE 이름으로 Python 상수를 정의하고 관련 값을 그룹화하며 고정 멤버에는 Enum을 사용하는 방법을 알아봅니다.

이 페이지의 내용

Python 에는 이름을 영구적으로 읽기 전용으로 만드는 const 선언이 없습니다. 일반적으로 모듈 수준 이름을 UPPER_CASE 로 정의하고 재할당을 코드 리뷰에서 지적할 문제로 취급합니다. 관련 값은 클래스로 묶고, 고정된 이름 있는 멤버 집합에는 Enum 을 사용합니다.

UPPER_CASE 이름으로 모듈 상수 정의하기

모듈이나 패키지에서 공유하는 값은 위쪽에 두고 이름을 대문자와 밑줄로 작성합니다. 다른 모듈에서 정상적으로 가져올 수 있지만 Python 은 이름의 재바인딩을 허용합니다.

TIMEOUT_SECONDS = 30
SUPPORTED_FORMATS = ("json", "toml")

print(TIMEOUT_SECONDS)
TIMEOUT_SECONDS = 60  # Legal Python, but a reassignment of a constant by convention.
print(TIMEOUT_SECONDS)

출력:

30
60

튜플은 해당 객체의 변경을 막지만 모듈 이름을 불변으로 만들지는 않습니다. SUPPORTED_FORMATS는 재바인딩할 수 있고 리스트 같은 가변 값은 제자리에서 바꿀 수 있습니다. 가능하면 불변 값을 선택하고 공개 설정이나 API의 일부인 상수는 모듈에 둡니다.

관련 값을 클래스로 그룹화하기

클래스는 Settings.DEFAULT_TIMEOUT처럼 접근하는 읽기 쉬운 네임스페이스를 제공합니다. 정리에는 유용하지만 일반 클래스 속성은 언어가 강제하는 상수가 아니므로 클래스와 보통 인스턴스도 수정할 수 있습니다.

class Settings:
    DEFAULT_TIMEOUT = 30
    RETRY_LIMIT = 3


print(Settings.DEFAULT_TIMEOUT)
Settings.DEFAULT_TIMEOUT = 60
print(Settings.DEFAULT_TIMEOUT)

출력:

30
60

사용자 정의 디스크립터나 메타클래스로 할당을 거부할 수 있지만 복잡성이 늘고 인스턴스 속성, 상속 및 다른 변경 경로도 처리해야 합니다. 명시적이고 테스트된 강제 요구가 없다면 일반 클래스는 네임스페이스로 사용하세요.

이름 있는 고정 값 집합에는 Enum 사용하기

값을 정의된 멤버로 제한해야 한다면 표준 라이브러리 enum 모듈을 사용합니다. Enum 멤버는 클래스를 통해 접근하며 새 멤버 값을 할당하면 예외가 발생합니다. 상태, 색상, 모드처럼 집합 자체에 의미가 있을 때 적합합니다.

from enum import Enum


class Color(Enum):
    RED = "red"
    BLUE = "blue"


print(Color.RED.value)
try:
    Color.RED = "green"
except AttributeError as error:
    print(type(error).__name__)

출력:

red
AttributeError

Enum 은 모든 값을 불변으로 만들지 않으며 원시 문자열과 동일하지도 않습니다. 멤버 정체성이 중요하면 Color.RED, API가 기본 값을 요구하면 Color.RED.value를 사용합니다. 외부 입력에는 Color("red")를 사용하고 알 수 없는 값으로 발생하는 ValueError를 처리하세요.

namedtuple과 함수를 대안으로 고려하기

기존 collections.namedtuple() 은 불변 필드를 묶을 수 있습니다. Constants = namedtuple("Constants", "PI E") 다음에 values = Constants(3.14159, 2.71828)을 실행하면 필드에 할당할 수 없는 튜플이 만들어집니다. 하지만 values 재바인딩은 막지 못하며 이름 있는 선택지에는 Enum 이 더 표현력이 좋습니다.

값을 반환하는 함수는 생성을 숨기거나 필요할 때 계산할 수 있지만 상수 선언은 아닙니다. def api_version(): return "v1"은 접근자를 뜻합니다. 단순한 상수에는 모듈 이름, 그룹화에는 클래스, 닫힌 집합에는 Enum 을 선택하세요.

패턴을 선택하고 검증하기

일반 공유 값에는 UPPER_CASE 모듈 이름, 정리에는 클래스, 고정 도메인 집합에는 Enum 을 사용합니다. 변경 경계를 명확히 하세요. 일반 이름과 클래스 속성은 재바인딩할 수 있지만 Enum 멤버는 재할당을 거부합니다. 위 예제는 성공적인 접근과 중요한 실패 또는 재할당을 검증합니다. 리뷰, 테스트 및 명확한 API도 필요합니다.

요약

Python 에는 내장 const 키워드가 없습니다. 일반 상수는 모듈 수준 UPPER_CASE 이름으로 정의하고 관련 상수는 클래스로 묶으며 고정된 이름 있는 멤버 집합에는 Enum 을 선택합니다. namedtuple() 과 함수 접근자는 강제 상수가 아니라 목적에 맞는 대안입니다.