Flake8 - F403 - ‘from module import *’ used; unable to detect undefined names

1 분 소요

Intro - flake8

  • 저는 VS-code를 IDE로 사용해서 코딩을 합니다.
  • 그리고, 예전에는 컴퓨터가 좀 좋지 못해서 pyhon-linter 를 사용하지 않았는데, 컴퓨터를 바꾸고 나서는 딱히 램 등에 문제가 없어서 설치해서 사용하고 있죠.
  • 그중에서 저는 flake8를 사용해서 설치하고 있습니다.

flake8?

  • flake8은 파이썬 패키지 중 하나로, 파이썬 코드에 문제가 있을 경우 혹은 문제는 아니지만, 좋지 못한 코딩 스타일을 갖추고 있다고 생각되는 경우(Coding Convention에 어긋나는 경우)에 대해서, “고쳐라”라고 말해주는 아이들을 말합니다.
  • 매우 귀찮긴 한데, 몇몇 아이들은 “좀 귀찮지만, 저렇게 하는게 좋겠지”라는 생각이 들기도 해서, 쉽게 코딩하면서 “나의 잘못된 습관”을 고칠 수 있으므로 결과적으로는 이득이죠.

F403 - not from module import *

  • 저는 코드를 다음처럼 사용할 때가 있습니다.
  • 그리고, 저만 그런게 아니라고 확신합니다.
  • 귀찮아서, 그냥 이렇게 하시는 경우 꽤 많지 않나요?
from module import *
  • 아무튼, 그런데, 이렇게 해버리면 flake8에서는 다음과 같은 워닝 메세지를 발생시킵니다.
from HEADER import *' used; unable to detect undefined names 
flake8(F403)
  • “이렇게 써버리면, flake8에서 정의되지 않은 이름을 발견하는 것이 불가합니다”라고 메세지를 전달해주죠.
  • 더 자세한 내용은 여기에서 볼 수 있고, 아래에 좀 더 정리해두었습니다.

F403 - AntiPattern

  • 우선 ‘안티패턴’은 “매우 많이 사용되지만, 비효율적인 패턴”을 말합니다.
  • 아래와 같이, 이미 많이 사용되는 코드이지만, 이렇게 표현할 경우에는 개발자가 “어떤 함수/객체를 사용하기 위해 해당 라이브러리를 참고했는지” 불분명해지죠.
from users.models import *
from auth.models import *

user = User.objects.get(name='Grant')

F403 - Best Practice

  • 반대로, 아래와 같이 만들 경우에는 매우 명확해집니다.
from users.models import User
from auth.models import check_password

user = User.objects.get(name='Grant')
check_password(user.username, 'password')

wrap-up

  • 사실, 타당한 방식인데, 그냥 귀찮다는 이유로 하지 않은 것이죠.
  • 앞으로는, 항상 사용한 함수만 import하는 방식으로 처리하도록 하겠습니다.

댓글남기기