[Python] flake8을 이용한 파이썬 정적 코드 분석 Develop Tip

이번 PyCon2015 을 들으면서 여러 다양한 내용을 들을 수 있었고,
게 중에 당장이라도 써 먹을 수 있는 것이 있어 소개해 볼까 합니다.

어떤 코드 분석에는 정적 분석과 동적 분석으로 나뉩니다.
(정적 코드 분석과 동적 코드 분석의 이해 라는 블로그에 잘 설명되어 있습니다.)

게중 최근에 파이썬 flake8 이라는 것이 있습니다.

$ sudo pip install flake8
이라고 간단하게 설치가 완료됩니다.

그리고 아래와 같은 내용을 ~/.config/flake8 파일에 넣습니다.

[flake8]
;W191:indentation contains tabs
;E101:indentation contains mixed spaces and tabs
;E126:continuation line over-indented for hanging indent
;E131:continuation line unaligned for hanging indent
;E203:whitespace before ':'
;E226:missing whitespace around arithmetic operator
;E231:missing whitespace after ':'
;E261:at least two spaces before inline comment
;E265:block comment should start with '# '
;E302:expected 2 blank lines, found 0
;E701:multiple statements on one line (colon)
;C901: ... is too complex (nn)
ignore = W191,E101,E126,E131,E203,E226,E231,E261,E265,E301,E302,E701,C901
max-line-length = 160
exclude = tests/*
max-complexity = 10

전체 파이썬 프로젝트에서 탭을 Indentation으로 사용하므로
관련 경고를 ignore 시켰습니다.

그 다음 
$ flake8 proj_folder
와 같이 실행시킵니다. (폴더가 아니라 해당 파이썬 파일을 넣어도 됩니다)

처음부터 PyCharm에서 PEP8을 켜 놓고 작업을 했어야 했는데...
하는 생각도 들었습니다.

F3/conf.py:202:1: W293 blank line contains whitespace
이부분은 소스에서 빈 라인인데 공백 문자를 가지고 있다는 것이네요... 뭐 한 바이트라도 줄이는게 맞습니다.

F3/conf.py:212:36: W291 trailing whitespace
                0x44000000 : '[AS upgrade] | %s',
마지막 명령이 끝나고 이후에 공객문자가 포함되어 있다는 것이니 이것도 줄이도록 하구요,

F3/conf.py:359:29: W601 .has_key() is deprecated, use 'in'
        if not __ERROR_CODE[locale].has_key(code):
그동안 dict에서 특정 키가 존재하는 가를 has_key 함수를 이용했었는데, 여기서도 in 연산자를 이용하라는 군요...
다음과 같이 테스트해 보았습니다.
>>> d={'a':1,'b':2,'c':3}
>>> d
{'a': 1, 'c': 3, 'b': 2}
>>> 'a' in d
True
>>> 'b' in d
True
>>> 'd' in d
False
>>> 1 in d
False
아하~~ 그냥 dict에 해당 키가 존재하는 가를 in 연산자로 간단하게 되네요...
위의 코드는
        if code not in __ERROR_CODE[locale]:
훨씬 가독성이 좋군요~

F3/conf.py:364:28: E231 missing whitespace after ','
                except UnicodeDecodeError,e:
콤마 다음에 공백을 하나 추가하면 됩니다. 역시나 가독성을 높이는 목적이군요.
                except UnicodeDecodeError, e:

F3/conf.py:365:73: E231 missing whitespace after ','
                        return __ERROR_CODE[locale][code].decode('utf8') % tuple([unicode(arg,'utf8') for arg in args])
앞에 것과 동일하게 콤마 다음에는 공백을 하나 넣으라는 것이네요.

F3/conf.py:366:19: F841 local variable 'e' is assigned to but never used
        except Exception, e:
해당 예외를 e라고 받고서는 그 블럭에서 사용하지 않았다는 것이네요.
        except Exception:
라고 하면 됩니다.

F3/conf.py:411:1: C901 'FException._addAuditLog' is too complex (11)
        def _addAuditLog(self, *args):
이렇게 나오는데 이것은 오류는 아닌데, 너무 어려운 구문을 사용했다 하네요... 이것도 ignore에 넣어도 될 듯 합니다.

f841.py:3:7: E712 comparison to True should be 'if cond is True:' or 'if cond:'
if b == True:
위에 것은
if b:
라고 하면 되겠지요.

아주 오래 전, C로 프로그램을 하다가 컴파일을 하면서
나오는 warning은 그냥 넘어간 적이 있었습니다.
그러다가 어떤 계기로 해당 워닝 메시지 하나 하나가 모두 의미를
가지고 있는 것으로 판단하고 그 다음부터는 워닝하나도 없이
컴파일을 하도록 하고는 했는데요...

파이썬이 자체 컴파일 언어가 아니다 보니
이렇게 flake를 이용하여 소스를 살펴보고 수정함으로써,
더 보기좋고 에러가 적은 코드로 거듭나겠다는 생각입니다.


어느 분께는 도움이 되셨기를...

핑백

  • 지훈현서 : [Python] Visual Studio Code를 파이썬 IDE 로 이용해 보기 2017-05-26 13:38:28 #

    ... 현재 멈춘 상태에서의 다양한 컨택스트의 확인 및 수정도 가능합니다. 그리고 디폴트로 pylint, pep8, flake8 등의 정적 코드 분석을 합니다.(flake8을 이용한 정적코드 분석 관련 참조) PyCharm 에서도 처음에는 PEP8 이 너무 많은 Warning을 보여주어 끄고 했다가요즘에는 PEP8을 적용하는게 맞다 라고 생 ... more

덧글

  • 버섯 2015/09/01 18:40 # 삭제 답글

    늘 좋은 팁 감사합니다. 아직 파이썬의 이해도가 부족한 제게 유용한 팁인 것 같습니다.
  • 지훈현서아빠 2015/09/01 20:09 #

    도움이 되셨다니 저의 보람입니다~~ ^^
  • 마안두 2015/09/02 08:51 # 삭제 답글

    code inspection이군요. 감사합니다.
  • 지훈현서아빠 2015/09/02 09:19 #

    도움이 되셨다니 저의 보람입니다~ ^^
댓글 입력 영역

구글애드텍스트