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” 입니다. 함수내부에서 파라미터 의 검사를 하는것이 틀린 방법은 아닙니다. 하지만 부득이한 경우가 아니라면 함수에 정상적인 값이 들어온다는 전제하에 함수를 작성하는 것이 효율적입니다. 위와 같은 코드의 단점은 무엇일까요?
- 함수 호출시 항상
None
체크 로직을 통과하게 된다.- 함수에는 일반적으로 대부분 정상적인 데이터가 들어오고, 아주 드물게 잘못된 데이터가 전달될것으로 예상됩니다. 그렇다면 매개변수의 검증은 호출하는 쪽에서 다루는게 맞을것입니다. 만약 항상 매개변수에 대한 검증이 필요하다면, 함수에 포함시키는 것보다는
decorator
로 분리하거나, 검증 함수를 두는 것이 좋은 방법이 될수있습니다.
- 함수에는 일반적으로 대부분 정상적인 데이터가 들어오고, 아주 드물게 잘못된 데이터가 전달될것으로 예상됩니다. 그렇다면 매개변수의 검증은 호출하는 쪽에서 다루는게 맞을것입니다. 만약 항상 매개변수에 대한 검증이 필요하다면, 함수에 포함시키는 것보다는
- 함수의 목적이 희석되다.
- 일반적으로 함수가 단일 목적을 갖고 작성되면, 수많은 장점을 얻게 됩니다.
- 함수가 수행하려는 목적에 맞는 코드만 존재함으로서 처리 로직에 집중할 수 있게됩니다.
- 가독성 향상. 무엇보다 코드가 날씬하고 이뻐집니다. 데헷. (
파이썬 코드는 언제나 이뻐야한다!!!)
- 일반적으로 함수가 단일 목적을 갖고 작성되면, 수많은 장점을 얻게 됩니다.
- 검증 로직의 추가가 필요하다면?
- 해당 함수를 호출하는 곳이 많아지고, 매개변수 종류가 다양해 짐에 따라 검증로직을 계속 추가할수 없습니다.
- 결국 특정 매개변수의 검증은 호출하는 곳에서 이루어 지는것이 좋은 경우도 있습니다.
일반적으로 말하는 함수에서의 Null Validation
과 같은 검증 로직에 대한 생각을 간단하게 정리해 보았습니다. 위 내용이 정답은 아니지만 코드 작성시 자주 접하는 고민 사항임으로 같이 생각해보고 싶어서 글을 쓰게되었습니다. 읽어주셔서 감사합니다. 피드백은 언제나 환영합니다^^.
python pep pythonic convention