[CS]PEP8이란?
PEP8 | style guide for Python code
1
2
$pip install pep8
$pep8 main.py
PEP8 위반 보고서 얻을 수 있음.
- 들여쓰기
- 첫째 줄에 인자가 있으면 세로로 맞추어야 함.
- 첫째 줄에 인자가 없으면 들여쓰기로 다음행과 구별이 되도록 해야함.
- 괄호를 닫을 때는 마지막 줄이나 첫번째 줄에 맞추어 닫음.
- 탭 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
문자열 쿼트(String Quotes)
- ” 와 ‘ 구분은 따로 없으나 docstring에 사용할때는 “ 권장.
- 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.'
후행 쉼표(When to Use Trailing Commas)
- Tuple 생성 시 넣어야함 (tuple = ‘abc’, )
후행 쉼표 사용 시 ‘나중에 추가가 있겠구나’라고 예상이 가능
1 2 3 4 5 6 7
FILES = [ 'setup.cfg', 'tox.ini', ] initialize(FILES, error=True, )
주석은 아예 없는 것보다 상이한것이 나쁘다. 즉, 최신상태로 유지를 항상 우선순위로 두자
완전한 문장으로 영문 작성시 첫글자는 대문자여야 함.
문장들은 마침표로 끝맺어야함.
주석들 마침표 뒤에는 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',
}
작명 규칙(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
- (Overriding Principle)
프로그래밍 권장사항(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.