python에서는 pylint와 pep8을 사용하여 스타일 검사가 다릅니다.
엄밀히 따지면 이둘은 약간 성격이 다릅니다.
우선 pylint에 대해서 먼저 알아보도록 하겠습니다.
$ vim app.py import requests as rq def test(): print('test') if __name__ == "__main__": test() $ pylint app.py************* Module appW: 4, 0: Found indentation with tabs instead of spaces (mixed-indentation)W: 7, 0: Found indentation with tabs instead of spaces (mixed-indentation)C: 1, 0: Missing module docstring (missing-docstring)C: 3, 0: Missing function docstring (missing-docstring)W: 1, 0: Unused requests imported as rq (unused-import) ... 중략
3종류의 메시지가 출력이 됩니다.
1. 탭을 사용하지 않고 스페이스를 사용
2. docstring을 사용하지 않음
3. 사용하지 않는 모듈을 import
docstring이란? docstring은 modlue, class, function의 설명을 작성하는 부분입니다. python에서는 ''' 설명... :parameter {type} : 설명 :return {type} : 설명 ''' 의 형태로 작성이 됩니다.
그럼 위의 메시지를 바탕으로 수정을 해보도록 하겠습니다.
$ vim app.py ''' ''' def test(): ''' ''' print('test') if __name__ == "__main__": test() $ pylint app.py************* Module appC: 1, 0: Empty module docstring (missing-docstring)C: 3, 0: Empty function docstring (missing-docstring)... 중략
이번에는 docstring이 비었다고 합니다.(참 까다로운 녀석입니다 ㅋㅋㅋ)
$ vim app.py ''' 2017.03.04 ''' def test(): ''' test function입니다. ''' print('test') if __name__ == "__main__": test() $ pylint app.py... 중략
이번에는 깨끗하게 출력이 됩니다.
이번에는 작명 표기법에 대한 테스트를 해보겠습니다
카멜 표기법과 스네이크 표기법을 구별을 해서 검사를 해줄지 궁금하네요
$ vim app.py ''' 2017.03.04 ''' class a_test: def __init__(self): self.aTest = 'asd' def test(): ''' test function 입니다. ''' print('test') if__name__ == '__main__': test()
$ pylint app.py************* Module appC: 6, 0: Trailing whitespace (trailing-whitespace)C: 5, 0: Invalid class name "a_test" (invalid-name)C: 8, 8: Invalid attribute name "aTest" (invalid-name)C: 5, 0: Missing class docstring (missing-docstring)R: 5, 0: Too few public methods (0/2) (too-few-public-methods)... 중략
클래스 이름과 속성에서 잘못된 이름을 사용했다고 나옵니다.
클래스 내부에 public methods 적다고 나오네요 2개를 채워야 하나봅니다
$ vim app.py ''' 2017.03.04 ''' class ATest: def __init__(self): self.a_test = 'te' def test(self): print('ATest test method') def test(): ''' test function ''' print('test') if __name__ == '__main__': test():
$ pylint app.py************* Module appC: 6, 0: Trailing whitespace (trailing-whitespace)C: 9, 0: Trailing whitespace (trailing-whitespace)C: 5, 0: Missing class docstring (missing-docstring)C: 10, 4: Missing method docstring (missing-docstring)R: 10, 4: Method could be a function (no-self-use)R: 5, 0: Too few public methods (1/2) (too-few-public-methods)... 중략
카멜 케이스와 스네이크 케이스를 적절히 사용을 하니 작명에 대한 이수는 사라졌습니다.
trailing whitespace는 라인 마지막에 스페이스를 의미 합니다.
참고로 클래스 이름을 제외한 모든 이름은 스네이크 케이스를 pep8에서 권장을 하고 있습니다.
$ vim app.py ''' 2017.03.04 ''' class ATest: ''' 해당 클래스는 어쩌구 저쩌구 ''' def __init__(self): self.a_test = 'asd' def test(self): ''' self.a_test를 어쩌구 저쩌구 함 ''' return self.a_test def test1(self): ''' 해당 메소드는 어쩌구 저쩌구 ''' return False def _test2(self): ''' 해당 메소든는 private입니다 ''' return True def test(): ''' test function '''' print('test') if __name__ == '__main__': test() $ pylint app.py... 중략
잘 됩니다.
그리고 결과를 보면 중략이라고 해놓았는데
Report======13 statements analysed.Statistics by type------------------+---------+-------+-----------+-----------+------------+---------+|type |number |old number |difference |%documented |%badname |+=========+=======+===========+===========+============+=========+|module |1 |1 |= |100.00 |0.00 |+---------+-------+-----------+-----------+------------+---------+|class |1 |1 |= |100.00 |0.00 |+---------+-------+-----------+-----------+------------+---------+|method |4 |4 |= |100.00 |0.00 |+---------+-------+-----------+-----------+------------+---------+|function |1 |1 |= |100.00 |0.00 |+---------+-------+-----------+-----------+------------+---------+Raw metrics-----------+----------+-------+------+---------+-----------+|type |number |% |previous |difference |+==========+=======+======+=========+===========+|code |15 |45.45 |15 |= |+----------+-------+------+---------+-----------+|docstring |18 |54.55 |18 |= |+----------+-------+------+---------+-----------+|comment |0 |0.00 |0 |= |+----------+-------+------+---------+-----------+|empty |0 |0.00 |8 |-8.00 |+----------+-------+------+---------+-----------+Duplication-----------+-------------------------+------+---------+-----------+| |now |previous |difference |+=========================+======+=========+===========+|nb duplicated lines |0 |0 |= |+-------------------------+------+---------+-----------+|percent duplicated lines |0.000 |0.000 |= |+-------------------------+------+---------+-----------+Messages by category--------------------+-----------+-------+---------+-----------+|type |number |previous |difference |+===========+=======+=========+===========+|convention |0 |0 |= |+-----------+-------+---------+-----------+|refactor |0 |0 |= |+-----------+-------+---------+-----------+|warning |0 |0 |= |+-----------+-------+---------+-----------+|error |0 |0 |= |+-----------+-------+---------+-----------+
아래에는 추가적이로 이러한 정보를 나타납니다.
단순하게 pep만 검사를 해보고 싶다. 그리고 new line에 대해서 좀더 엄격하게 검사를 하고 싶다면 . pylint가 아닌 pep8을 사용하시는 것을 권장합니다.
$ pep8 app.pyapp.py:4:1: E302 expected 2 blank lines, found 0app.py:10:5: E301 expected 1 blank line, found 0app.py:15:5: E301 expected 1 blank line, found 0app.py:20:5: E301 expected 1 blank line, found 0app.py:25:1: E302 expected 2 blank lines, found 0
이것이 pep8의 결과입니다.
근데 pep8에서는 카멜 케이스, 스네이크 케이스에 대해서 검사가 엄격하지가 않네요
아무래도 이 두가지를 같이 쓰는것이 좋아보입니다.
댓글
댓글 쓰기