"Least Astonishment"와 "Mutable Default Argument"를 이용한 파이썬 프로그래밍
**"Mutable Default Argument"**는 함수 정의에서 기본값으로 변경 가능한 변수를 사용하는 것을 의미합니다. 이는 함수를 호출할 때 기본값을 변경할 수 있다는 것을 의미하며, 코드를 더욱 유연하게 만들 수 있습니다.
이 두 가지 개념을 함께 사용하면 사용자에게 더욱 놀라지 않고 사용하기 쉬운 파이썬 코드를 작성할 수 있습니다.
예시:
def add_numbers(a, b=0):
"""두 수를 더합니다.
Args:
a: 첫 번째 수.
b: 두 번째 수. 기본값은 0입니다.
Returns:
두 수의 합.
"""
return a + b
print(add_numbers(5)) # 5 출력
print(add_numbers(5, 3)) # 8 출력
위 코드에서 add_numbers
함수는 두 개의 인수를 받습니다. 첫 번째 인수 a
는 필수 인수이고, 두 번째 인수 b
는 기본값이 0인 선택적 인수입니다. 함수를 호출할 때 두 번째 인수를 생략하면 기본값 0이 사용됩니다.
이 코드는 "Least Astonishment" 원칙을 따릅니다. 왜냐하면 사용자는 함수를 처음 호출할 때 두 번째 인수를 생략할 수 있다는 것을 예상할 수 있기 때문입니다. 또한 "Mutable Default Argument"를 사용하여 코드를 더욱 유연하게 만들었습니다. 왜냐하면 사용자는 필요에 따라 두 번째 인수의 값을 변경할 수 있기 때문입니다.
다음은 "Least Astonishment"와 "Mutable Default Argument"를 사용할 수 있는 다른 예시입니다.
- 함수의 기본값을 사용자 설정으로 변경할 수 있도록 합니다.
- 함수를 호출할 때 인수를 생략할 수 있도록 합니다.
"Least Astonishment"와 "Mutable Default Argument"를 이용한 예제 코드
예제 1: 함수의 기본값을 사용자 설정으로 변경하기
이 예제에서는 get_config
함수의 기본값을 사용자 설정으로 변경하는 방법을 보여줍니다.
import configparser
def get_config(config_file="config.ini", section="DEFAULT"):
"""설정 파일에서 설정 값을 읽습니다.
Args:
config_file: 설정 파일 경로. 기본값은 "config.ini"입니다.
section: 설정 섹션 이름. 기본값은 "DEFAULT"입니다.
Returns:
configparser.ConfigParser 객체.
"""
config = configparser.ConfigParser()
config.read(config_file)
return config[section]
# 사용자 설정으로 기본값 변경
config = get_config()
config["DEFAULT"]["log_level"] = "INFO"
config.write()
# 변경된 기본값 사용
print(get_config()["DEFAULT"]["log_level"]) # INFO 출력
위 코드에서 get_config
함수는 config_file
과 section
이라는 두 개의 기본값을 가진 두 개의 인수를 받습니다. 함수를 호출할 때 두 번째 인수를 생략하면 기본값 "config.ini"와 "DEFAULT"이 사용됩니다.
예제 2: 함수 호출 시 인수 생략하기
이 예제에서는 send_email
함수를 호출할 때 인수를 생략하는 방법을 보여줍니다.
def send_email(recipient, subject, message, **kwargs):
"""이메일을 전송합니다.
Args:
recipient: 수신자 이메일 주소.
subject: 제목.
message: 본문.
**kwargs: 추가 옵션.
Returns:
True: 전송 성공, False: 전송 실패.
"""
# 이메일 전송 코드
# 이메일 전송 (기본 옵션만 사용)
send_email("[email protected]", "제목", "본문")
# 이메일 전송 (추가 옵션 사용)
send_email("[email protected]", "제목", "본문", cc="[email protected]")
"Least Astonishment"와 "Mutable Default Argument" 대체 방법
변경 가능한 기본값 대신 명시적 인수 사용:
"Mutable Default Argument"를 사용하는 대신, 함수의 모든 인수를 명시적으로 정의하는 것이 더 나은 경우가 있습니다. 이렇게 하면 코드가 더 명확하고 읽기 쉬워지고, 의도하지 않은 변경을 방지하는 데 도움이 될 수 있습니다.
def add_numbers(a, b):
"""두 수를 더합니다.
Args:
a: 첫 번째 수.
b: 두 번째 수.
Returns:
두 수의 합.
"""
return a + b
print(add_numbers(5, 3)) # 8 출력
기본값 대신 None 사용:
기본값이 변경될 가능성이 높은 경우, None
을 기본값으로 사용하는 것이 더 나은 방법일 수 있습니다. 이렇게 하면 함수가 예상치 않은 인수를 받았을 때 오류를 발생시키도록 하여 코드를 더욱 강력하게 만들 수 있습니다.
def get_config(config_file=None, section="DEFAULT"):
"""설정 파일에서 설정 값을 읽습니다.
Args:
config_file: 설정 파일 경로. 기본값은 None입니다.
section: 설정 섹션 이름. 기본값은 "DEFAULT"입니다.
Returns:
configparser.ConfigParser 객체 또는 None.
Raises:
ValueError: config_file이 None이고 환경 변수 CONFIG_FILE도 설정되지 않은 경우.
"""
if config_file is None:
config_file = os.environ.get("CONFIG_FILE")
if config_file is None:
raise ValueError("config_file이 None이며 환경 변수 CONFIG_FILE도 설정되지 않았습니다.")
config = configparser.ConfigParser()
config.read(config_file)
return config[section]
별도의 함수 사용:
함수가 여러 가지 기본값을 가질 경우, 별도의 함수를 사용하여 기본값을 관리하는 것이 더 나은 방법일 수 있습니다. 이렇게 하면 코드를 더욱 모듈화하고 유지 관리하기 쉬워집니다.
def get_default_config():
"""기본 설정 값을 반환합니다."""
return {
"log_level": "INFO",
"email_sender": "[email protected]",
}
def get_config(config_file="config.ini", section="DEFAULT"):
"""설정 파일에서 설정 값을 읽습니다.
Args:
config_file: 설정 파일 경로. 기본값은 "config.ini"입니다.
section: 설정 섹션 이름. 기본값은 "DEFAULT"입니다.
Returns:
configparser.ConfigParser 객체.
"""
config = configparser.ConfigParser()
config.read(config_file)
# 기본 설정 값 적용
for key, value in get_default_config().items():
if key not in config[section]:
config[section][key] = value
return config[section]
도메인 별 특정 라이브러리 사용:
특정 도메인에서 작업하는 경우, 해당 도메인에 특화된 라이브러리를 사용하는 것이 더 나은 방법일 수 있습니다. 이러한 라이브러리는 종종 "Least Astonishment"와 "Mutable Default Argument"와 같은 프로그래밍 원칙을 이미 고려하여 설계되어 있으므로 코드를 더욱 명확하고 효율적으로 작성할 수 있습니다.
예를 들어, 날짜와 시간을 처리하는 경우 datetime
라이브러리를 사용하는 것이 좋습니다. 이 라이브러리는 날짜와 시간을 처리하는 데 필요한 다양한 함수와 클래스를 제공하며, "Least Astonishment" 원칙을 따르도록 설계되었습니다.
python language-design default-parameters