파이썬 함수의 리턴 타입이 여러가지가 필요할 때 올바른 방법 ?

저는 다음과 같이 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답변

  • 좋아요

    0

    싫어요
    채택취소하기

    안녕하세요 :-)

    리턴타입이 조건에 따라 변경된다는 것은... 제가 생각하기에 한 가지 함수가 두 가지 이상의 기능이나 처리를 하려할 때같이 좋지 못한 코드 모양새를 가지게 되면 이런 경우가 생길 수 있을 것같아요.

    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로 추상화 하는 것도 가능은 합니다. 경우에 따라 방법은 여러가지라... 🤔

    그래도 가장 좋은 건, 저런 경우를 만들지 않는 게 아닐까 싶어요...ㅎㅎ

    즐거운 프로그래밍 하세요. 감사합니다.

    • 여러파일(csv, json 등등 ) 에서 의미상 관련있는 유사한 정보를 읽어오는 코드가 여기저기 널려있는 것 같아서 정리해서 파일여는 부분을 하나의 함수로 통일하려고 했는데 ... 함수하나로 통일하는 건 다시 생각해봐야 겠네요. 답변 감사합니다. 홍가뤼 2018.12.7 00:20
  • 동적타입언어에서 리턴형이 여러가지인 함수를 만들면 사용하는 쪽에서 많이 힘듭니다.

    파이썬은 분명 동적타입의 언어이지만 제공되는 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 함수로 변환하면 됩니다.

    하나의 함수에서 여러가지 기능을 하려고 하지 마시기 바랍니다.

    • 생각해보니 택배 받는거랑 똑같군요. 제가 생각했던건 포장다 벗기고 알맹이만 받겠다는 생각이었는데 그렇게 되면 택배 아저씨가 배달하기 힘들겠네요. 포장 벗기는게 귀찮더라도 시퀀스타입으로 포장해서 받는게 다루기 쉽고 안전하다는... 답변고맙습니다. 채택대신 thumbs up 드립니다 ~~ 홍가뤼 2018.12.7 13:29

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.