프로그램밍 언어에서 관례적으로 이 변수에는 다른 값을 할당하지 마세요
라는 약속을 할 때 대문자와 _ 를 사용하여 변수를 선언한다.
Java
의 경우 보통 static final
로 선언한다.
public static final string CONST_NAME = "VAR_NAME"
이렇게 선언하면 해당 상수에 다른 값을 대입하려고 하면 에러를 발생시킨다.
하지만 Python 은 동적 언어이기 때문에 별도로 타입을 지정하지도 않으며, final
이라는 키워드도 없다. 따라서, 명시적으로 대문자와 _ 를 사용해서 상수를 선언하는 방법이 있다.
아래의 코드는 위키에서 가져온 샘플이다. 상수를 정의하는 .py 모듈을 만들고 그 곳에 상수를 정의한다. 그리고 해당 모듈을 다른 .py 모듈에서 import 하여 사용하는 방법이다.
"""constant1.py"""
PI = 3.14
GRAVITY = 9.8
"""Ex06_constant1.py"""
import constant1
print(constant1.PI)
print(constant1.GRAVITY)
constant1.PI = 3.141592 # 변경된다. 상수가 아니다.
print(constant1.PI)
여러 곳에서 공통적으로 사용하는 상수를 한 곳에 모아 놓을 수 있는 장점이 있다.
하지만 역시 선언한 변수에 다른 값을 넣으면 변경된다. 온전한 상수가 아니다.
Python 3.8
부터는 typing.Final 를 사용해서, 변수의 재할당을 방지하도록 하는 변수 주석이 있다고 한다. 그러나 실제로 재할당을 막지는 않는다.
from typing import Final
a: Final = 1
# Executes fine, but mypy will report an error if you run mypy on this:
a = 2
값이 변경된다는 단점을 보완하는 방법이다. 찾아보니 위키 교제에 나와 있었다.
"""constant2.py"""
class _constant2:
def __setattr__(self, name, value):
if name in self.__dict__:
raise Exception('변수에 값을 할당할 수 없습니다.')
self.__dict__[name] = value
def __delattr__(self, name):
if name in self.__dict__:
raise Exception('변수를 삭제할 수 없습니다.')
import sys
sys.modules[__name__] = _constant2()
"""OOO.py"""
import constant2
constant2.PI = 3.14
print(constant2.PI)
constant2.PI = 3.141592
print(constant2.PI)
상수를 저장할 class
를 만들고 파이썬에서 제공하는 setattr 을 변수를 설정한다.
뭔가 동적으로 상수를 관리하는 느낌이다.
코드를 보자.
# Decorator
def constant(func):
def func_set(self, value):
raise TypeError
def func_get(self):
return func()
return property(func_get, func_set)
# const class
class _Const(object):
@constant
def PAGE_INDEX():
return "/index"
@constant
def PAGE_MEMBER_LOGIN():
return "/member/login"
@constant
def PAGE_MEMBER_LOGOUT():
return "/member/logout"
CONST = _Const()
print(CONST.PAGE_INDEX) # /index
print(CONST.PAGE_MEMBER_LOGIN) # /member/login
print(CONST.PAGE_MEMBER_LOGOUT) # /member/logout
CONST.PAGE_MEMBER_LOGIN = "another_page" # TypeError
TypeError
가 나오는 것을 확인할 수 있다.여기까지 조사하니 좀 지치기 시작했다.. 왜냐면 다른 방법들이 너무 많았기 때문인데.. 조사한 바에 따르면 아래의 방법들이 더 있었다.
음.. Final
만 사용해도 충분하지 않을까..
프로젝트가 커지면 커질수록 관리하는 방법이 중요하다고 했는데,, 일단은 여기까지 하도록 하자. 파고들기엔 아직 배워야 할 파이썬 기술들이 많기 때문에 !
나중을 기약하도록 한다. 개인적으로는 JS ES6 처럼 const
가 나와줬으면 한다.
상세하고 자세한 글들이 많네요! 책쓰시나봐요! 너무 잘 참고하고 갑니다!^^