파이썬 함수의 리턴 타입이 여러가지가 필요할 때 올바른 방법 ?
조회수 4139회
저는 다음과 같이 return type이 조건에 따라 변경되는 함수가 필요한 데요.
def get_info(command):
if command == '리스트':
result = [1,2,3,4,5]
elif command == '숫자':
result = 3
elif command == '문자열':
result = 'string'
else:
print('명령({})은 구현되지 않았습니다'.format(command))
return result
print(get_info('리스트'))
print(get_info('숫자'))
print(get_info('문자열'))
위의 코드가 동작은 잘 되는데..
인터넷에서 다음과 같은 내용을 봤습니다.
링크 : Returning more than one variable type from function call
말하자면, 파이썬의 리턴타입을 한가지 이상으로 하면 이후 처리가 복잡해지기 때문에 "별로 좋지 않은 코딩방식이다" 라고 하면서 대신 에러처리를 이용하라고 되어있는데요.
위와 같이 각각의 다른 타입의 리턴이 에러가 아닌 정상 경로일 경우는 어떻게 처리하는것이 좋을까요? 각각의 경우를 별도의 함수로 만드는 게 좋을까요?
2 답변
-
안녕하세요 :-)
리턴타입이 조건에 따라 변경된다는 것은... 제가 생각하기에 한 가지 함수가 두 가지 이상의 기능이나 처리를 하려할 때같이 좋지 못한 코드 모양새를 가지게 되면 이런 경우가 생길 수 있을 것같아요.
def get_info(command): if type(command) == list: #리스트 result = [1,2,3,4,5] elif type(command) == int: #정수 result = 3 elif type(command) == str: #문자열 result = 'string' else: # 여긴 단순 print가 아니라 raise를 추가하면 더 좋을 것같아요. print('명령({})은 구현되지 않았습니다'.format(command)) return {"Result":result, "TranCd":"get_info"}
상황에 따라 get_info를 멤버로 가지는
class
를 사용해 리턴 값을 필드로 묶거나, 아니면 리턴 내용을 위 처럼map
으로 묶어 하나의 타입으로 통일 하거나 아예 리턴 값 자체를class
로 추상화 하는 것도 가능은 합니다. 경우에 따라 방법은 여러가지라... 🤔그래도 가장 좋은 건, 저런 경우를 만들지 않는 게 아닐까 싶어요...ㅎㅎ
즐거운 프로그래밍 하세요. 감사합니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
-
동적타입언어에서 리턴형이 여러가지인 함수를 만들면 사용하는 쪽에서 많이 힘듭니다.
파이썬은 분명 동적타입의 언어이지만 제공되는 api들을 보면 일관성이 있습니다.
def get_info(command): if isinstance(command, (list, tuple, string)): // sequence type return [], () "" 등 리턴 //sequence type 이므로(__getitem__ 구현) 리턴값은 []를 사용하여 슬라이싱이 가능합니다. else: raise 에러 v = get_info(variable_name)
v 는 sequence type 이라는 일관성이 있으므로 런타임에러를 방지 할 수 있습니다.
물론 list보단 immutable 한 tuple 로 리턴하는 것이 더 좋은 방법일겁니다.
개인적으로는 sequence type 이 리턴되는 경우, dict이 리런되는 경우 scalar type의 단일값(int, bool) 이 리턴되는 경우로 나누어 생각합니다.
sequence to dict 기능등을 별도로 제공하면 sequence 형태로만 리턴을 받고 필요한 경우 sequence to dict 함수로 변환하면 됩니다.
하나의 함수에서 여러가지 기능을 하려고 하지 마시기 바랍니다.
댓글 입력