22/1/2018

Python 함수 내부에서의 Null Validation 혹은 검증 로직에 대한 생각

def handle(data=None):
    """ 
   :param data: user's information, the type is dict
   :return: user's info added connection history
   """    
   if data is None:
        return {}
   ...
   return data

위와 같이 handle 함수에서 None 확인은 적절한 것일까요?

결론 부터 말하자면 NO 입니다. 함수내부에서 파라미터검사를 하는것이 틀린 방법은 아닙니다. 하지만 부득이한 경우가 아니라면 함수에 정상적인 값이 들어온다는 전제하에 함수를 작성하는 것이 효율적입니다. 위와 같은 코드의 단점은 무엇일까요?

  1. 함수 호출시 항상 None 체크 로직을 통과하게 된다.
    • 함수에는 일반적으로 대부분 정상적인 데이터가 들어오고, 아주 드물게 잘못된 데이터가 전달될것으로 예상됩니다. 그렇다면 매개변수의 검증은 호출하는 쪽에서 다루는게 맞을것입니다. 만약 항상 매개변수에 대한 검증이 필요하다면, 함수에 포함시키는 것보다는 decorator분리하거나, 검증 함수를 두는 것이 좋은 방법이 될수있습니다.
  2. 함수의 목적이 희석되다.
    • 일반적으로 함수가 단일 목적을 갖고 작성되면, 수많은 장점을 얻게 됩니다.
      1. 함수가 수행하려는 목적에 맞는 코드만 존재함으로서 처리 로직에 집중할있게됩니다.
      2. 가독성 향상. 무엇보다 코드가 날씬하고 이뻐집니다. 데헷. (파이썬 코드는 언제나 이뻐야한다!!!)
  3. 검증 로직의 추가가 필요하다면?
    • 해당 함수를 호출하는 곳이 많아지고, 매개변수 종류가 다양해 짐에 따라 검증로직을 계속 추가할수 없습니다.
    • 결국 특정 매개변수의 검증은 호출하는 곳에서 이루어 지는것이 좋은 경우도 있습니다.

일반적으로 말하는 함수에서의 Null Validation같은 검증 로직에 대한 생각을 간단하게 정리해 보았습니다. 위 내용이 정답은 아니지만 코드 작성시 자주 접하는 고민 사항임으로 같이 생각해보고 싶어서 글을 쓰게되었습니다. 읽어주셔서 감사합니다. 피드백은 언제나 환영합니다^^.


python pep pythonic convention


Previous post
50줄로 만들어 보는 tiny 블록체인 원문: Let’s Build the Tiniest Blockchain python -V: 3.6.4 비트코인이나 암호화폐의 트랜잭션을 공개적이며 순차적으로 기록하는 디지털 분산 원장 입니다. - Google Search 보다 일반적으로 설명하자면,
Next post
Dynamically import django settings for multiple environment such as local, dev, beta, production 장고 개발을 하다보면 각 환경을 구분하고, 이에 따라 변경되야 하는 부분들이 존재한다. 예를들면 임포트 되어야하는 미들웨어 혹은 장고 어플리케이션들, 데이터베이스 연결정보 등이 달라진다. 이럴때 각 환경에 따라 코드를 수정하는 작업은 해서는 안되는 작업이며,