코드:
STRATEGY_TYPE_MAPPING = {
'base-price': 'base_price',
'last-minute': 'last_minute',
'early-bird': 'early_bird',
'monthly': 'monthly',
'weekly': 'weekly',
'pacing': 'pacing',
'maximum': 'maximum',
'minimum': 'minimum',
'channel': 'channel',
}
def __init__(self):
self.validator = RateStrategyValidator()
self.VALID_STRATEGY_TYPES = list(STRATEGY_TYPE_MAPPING.keys()) # 인스턴스 초기화 시점에 설정
def modify_strategy(self, rate_strategy_id: int, strategy_type: str, strategy_data: Dict[str, Any] | List[float] | int | None) -> RateStrategy:
"""요금 전략의 특정 타입을 수정하는 메서드"""
# 모든 공백 문자 및 제어 문자 제거
strategy_type = ''.join(c for c in strategy_type if ord(c) >= 32)
if strategy_type not in self.VALID_STRATEGY_TYPES:
raise ValueError(f"유효하지 않은 전략 유형입니다. 가능한 타입: {self.VALID_STRATEGY_TYPES}")
if not rate_strategy_id:
raise ValueError("rate_strategy_id가 필요합니다.")
# strategy_data가 None인 경우는 허용 (전략 삭제)
if strategy_data is not None:
if strategy_type == 'base-price':
self.validator.validate_base_price(strategy_data)
elif strategy_type == 'monthly':
self.validator.validate_list_length(strategy_data, 12, strategy_type)
elif strategy_type == 'weekly':
self.validator.validate_list_length(strategy_data, 7, strategy_type)
elif strategy_type in ['last-minute', 'early-bird']:
self.validator.validate_dynamic_strategy(strategy_data, strategy_type)
elif strategy_type == 'channel':
self.validator.validate_channel_strategy(strategy_data, strategy_type)
elif strategy_type in ['maximum', 'minimum']:
self.validator.validate_maximum_minimum(strategy_data, strategy_type)
분명 저기 'channel'이 값에 있는데 계속해서
if strategy_type not in self.VALID_STRATEGY_TYPES:
이 부분에서 에러가 났다.
그래서 터미널에서 "strategy_type"과 "self.VALID_STRATEGY_TYPES"을 찍어보니 아래와 같이 뜸. 잉?
계속 찾아보니, 원래 입력된 strategy_type 문자열에 보이지 않는 제어 문자가 포함되어 있었기 때문에 단순한 문자열 비교 (strategy_type == 'channel')가 실패했던 것.
예)
'channel\r\n' # 끝에 캐리지 리턴과 라인피드가 있는 경우
# 또는
'\x00channel' # 앞에 NULL 문자가 있는 경우
해결방법: (아래코드 추가)
strategy_type = ''.join(c for c in strategy_type if ord(c) >= 32)