Post

[CS]PEP8이란?

PEP8 | style guide for Python code

1
2
$pip install pep8
$pep8 main.py

PEP8 위반 보고서 얻을 수 있음.

  1. introduction

    • PEP 8은 파이썬 코드의 깔끔하고 가독성이 좋은 코드 작성을 위한 스타일 가이드입니다.
  2. 코드 레이아웃(Code Lay-out)

  • 들여쓰기
    • 첫째 줄에 인자가 있으면 세로로 맞추어야 함.
    • 첫째 줄에 인자가 없으면 들여쓰기로 다음행과 구별이 되도록 해야함.
    • 괄호를 닫을 때는 마지막 줄이나 첫번째 줄에 맞추어 닫음.
  • 탭 or 스페이트
    • 한 프로젝트 안에 섞어 쓰는 일은 피해야 함. 즉, 하나만 써서 들여쓰기 사용.
  • 모든 줄은 79자 이내 권장.
    • 연산자로 인해 길어지는 경우 연산자 이전에 \(백슬래시) 사용으로 줄바꿈 하는 것이 좋음.
  • 빈 줄(Blank line)
    • 최상위 클래스나 함수 정의 앞 뒤로 두 개의 공백줄 사용.
    • 클래스 내 정의한 메소드들은 한 줄로 띄움.
  • 파일 인코딩(file encoding)
    • UTF-8 권장.(UTF-8 사용 시 명시할 필요 없음)
  • import
    • 파일의 맨위에 작성.
    • Standard, 3rd party, local application의 분류로 정의하고, 빈 줄을 사용해 구분 되도록 작성.
    • 절대경로 이용이 권장
    • 한 줄에 두개 모듈 임포트는 바람직하지 않음.
    • from으로 동일한 곳에서 여러 모듈을 불러올 때 한줄로 사용.
    • Dunders Name(양쪽에 더블 언더스코어 사용)
      • docstring과 import 코드 사이에 위치하는 것을 권장.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
  # 들여쓰기
  def my_function():
      if some_condition:
          do_something()

  # 한 줄의 최대 길이
  my_long_variable_name = some_long_function_name(argument1, argument2, argument3, argument4)

  # 여러 줄에 걸친 문장
  my_long_string = ('This is a long string that '
                    'spans multiple lines using '
                    'parentheses.')

  my_long_string = 'This is a long string that ' \
                  'spans multiple lines using ' \
                  'backslash.'

  # 함수와 클래스 사이에 빈 줄 추가
  class MyClass:
      pass

  def my_function():
      pass

  # 클래스 내부에서 메서드들 사이에 빈 줄 추가
  class MyClass:
      def method1(self):
          pass

      def method2(self):
          pass

  # 모듈 레벨 상수
  MY_CONSTANT = 10

  1. 문자열 쿼트(String Quotes)

    • ” 와 ‘ 구분은 따로 없으나 docstring에 사용할때는 “ 권장.
      1. 공백 표현(Whitespace in Expressings and Statements)

    • Pet Peeves
      • 괄호에 붙은 코드는 띄울필요 없음 (abc[1], {abc: 2})
      • , 와 닫는 괄호는 띄울 필요 없음 (0,)
      • : 사이 띄울필요 없지만 수식이나 함수가 들어간 경우 양 옆의 공백이 동일하도록 띄움
      • 변수 선언시 한칸씩만 띄우기. (y = 2, 세로 라인 맞춘다고 길게 하면 안좋음)
    • Other recommendations
      • 다른 연산자 사용 시에도 우선 순위가 낮은 연산자 주위로 스페이스 한칸씩 넣어 구분 (xx + yy)
      • function annotations 사용 시 : 와 -> 사용 시 스페이스를 넣어야함.
          def munge(input: AnyStr): …
          def munge() -> AnyStr: …
      • function annotations 사용안하고 default value 설정시 = 사이를 띄우면 안됨.
      • 코드 한줄에 한개의 명령문을 권장.
1
2
3
4
5
6
7
  # 문자열 쿼트
  my_string = "This is a string."
  my_string = 'This is also a string.'
  my_string = "This string contains the word 'quote'."
  my_string = 'This string contains the word "quote".'
  my_string = 'This string contains both \'single\' and "double" quotes.'

  1. 후행 쉼표(When to Use Trailing Commas)

    • Tuple 생성 시 넣어야함 (tuple = ‘abc’, )
    • 후행 쉼표 사용 시 ‘나중에 추가가 있겠구나’라고 예상이 가능

      1
      2
      3
      4
      5
      6
      7
      
      FILES = [
          'setup.cfg',
          'tox.ini',
          ]
      initialize(FILES,
            error=True,
            )
      
    1. 주석(Comments)

    주석은 아예 없는 것보다 상이한것이 나쁘다. 즉, 최신상태로 유지를 항상 우선순위로 두자
    완전한 문장으로 영문 작성시 첫글자는 대문자여야 함.
    문장들은 마침표로 끝맺어야함.
    주석들 마침표 뒤에는 2칸 공백 사용

    • 블록주석(Block Comments) - 뒤에오는 일부 코드에 적용되며, 해당 코드와 동일한 레벨로 들여쓰기가 되야한다.
    • Inline Comments) - 코드의 문과 같은 줄에 있는 주석이고 최소 2칸 공백으로 구분, 꼭 필요한 경우만 사용
    • Documentation Strings)
      • 모든 퍼블릭 모듈, 함수, 클래스 그리고 메서드들에 대해서 설명 작성.
      • 한줄로 된 스트링은 같은 줄에 닫아야함.
1
2
3
4
5
6
7
8
9
10
11
  fruits = [
      'apple',
      'banana',
      'cherry',
  ]

  person = {
      'name': 'John',
      'age': 30,
      'city': 'New York',
  }
  1. 작명 규칙(Naming Conventions)

    Python 작명 컨벤션은 좀 망쳐져 있어서 일관성 유지가 어렵다. 따라서 내부 라이브러리 일관성 유지가 우선.

    • (Overriding Principle)
      • _single_underscore : 약한 ‘내부 사용’ 지표(indicator)
      • single_underscore_ : python keyword와의 충돌을 피하기 위해 관례로 사용.
      • __double_underscore : 클래스 어트리뷰트의 이름을 지정할때, 네임 맹글링 호출(__boo - _class__boo)
      • double_underscore : magic 객체 또는 어트리뷰트
    • (Descriptive: Naming Styles)
      • lower : 모든 단어를 소문자로
      • upper : 모든 단어를 대문자로
      • snake_case : 단어 사이 언더 바(_)를 사용
         - Train_Case - 각 단어의 맨 앞글자를 대문자로 표기
         - spinal_case - 각 단어의 맨 앞글자를 소문자로 표기
      • camelCase(lowerCamelCase) - 단어의 첫 글자를 대문자료 표기, 단 첫번째 단어의 첫글자는 소문자로 표기.
      • PascalCase(UpperCamelCase) - 단어의 첫 글자를 대문자로 표기하는 표기법.
    • (Prescriptive: Naming Conventions)
      • 패키지명과 모듈명(Package and Module Names) : 모두 소문자를 사용하여 짧게 지어야함
      • 클래스명(Class Names) : CapWord 컨벤션(각 글자의 첫글자를 대문자로)을 따른다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
     # 변수명, 함수명
     my_variable = 10
     def my_function():
         pass
    
     # 클래스명
     class MyClass:
         pass
    
     # 모듈명
     import my_module
    
     # 상수
     MY_CONSTANT = 10
    
  2. 프로그래밍 권장사항(Programming Recommendations)

    • None 같은 싱글톤 비교는 is, is not으로 이루어져야함.(등호 안됨)
    • is not 보다 not … is 사용 권장.
    • Exception 포착 시, except 절 보다 특정 예외 언급.
    • return 문에 대한 일관성 유지. 반환문이 없는 곳은 ‘return None’ 으로 명시.
    • 접두어, 접미어 확인시 문자열 슬리이싱 대신 str.startswith(), str.endswith() 사용.
    • 오브젝트 타입 비교 시 isinstance(obj, basestring) 사용.
    • sequence(문자열, 리스트, 튜플)에서 빈 시퀀스가 False라는 사실 이용.
    • == 등호로 True 비교 하지말자.

    • 함수 어노테이션(Function Annotations)
    • 변수 어노테이션(Variable Annotations)
      • 변수 어노테이션은 콜론 다음 한 칸 공백.
    1
    2
    3
    4
    5
    6
    7
    8
    
     def greet(name: str) -> str:
         return 'Hello ' + name
    
     def repeat(item: str, times: int = 2) -> str:
         return item * times
    
     x: int = 5
     y: str = 'hello'
    
This post is licensed under CC BY 4.0 by the author.