-
Python PEP8 요약Programming/Python 2021. 2. 6. 19:02반응형
목 차
1. PEP 8 이란 무엇인가?
2. Whitespace
3. Naming
3 - 1 Naming Style
3 - 2 피해야 할 이름
4. 표현식과 문장
4 - 1 주석
4 - 2 뒤에 오는 콤마(Trailing comma)를 사용할 경우
4 - 3 변수 주석
5. import
8. 상수(constants)
9. 함수선언
10. 빈줄
11. 예외 설정(Error)1. PEP 8 이란 무엇인가?
● PEP8 : 파이썬 개선 제안서
파이썬 코드를 어떻게 구상할 지 알려주는 스타일 가이드
● 다른 사람과 원활하게 협업하려면 공통된 스타일 공유가 필요 합니다.
● 일관성 있는 스타일은 나중에 수정하기 쉽습니다.
2. Whitespace
● 들여쓰기는 Space 4번을 이용합니다.
● 한 줄의 문자 길이가 79자 이하여야 합니다.
# 좋은 예제: # Enter로 코드를 나눈 경우 ex_code = ((usage + sessiontime) / (total_usage + total_sessiontime))
# 나쁜 예제: # 한줄에 모든 코드를 넣는 경우 ex_code = ((usage+sessiontime)/(total_usage+total_sessiontime))
● 여러 줄로 길게 표현되는 문장은 괄호(소, 중, 대)를 이용해 여러 행으로 분리해 표현하는 것이 좋습니다.
어떠한 경우에는 백슬래시(backslash)를 사용해 연속 되는 문장의 줄 바꿈을 표현하는 것이 좋습니다.
아래의 긴 with문은 백슬래시를 사용하는 것이 적절합니다.
with open('/path/to/some/file/you/want/to/read') as file_1, \
open('/path/to/some/file/being/written', 'w') as file_2:
file_2.write(file_1.read())
● 함수와 클래스는 빈 줄 두개로 구분한다.
● 클래스에서 메서드는 빈 줄 하나로 구분한다.
# 좋은 예제: def test_function (A, B): C = A + B D = A - B return C, D Class Test_class: def __init__ (self, A, B): self.A = A self.B = B def Test_def (self): return self.A + self.B
# 나쁜 예제: def test_function(A, B): C = A + B D = A - B return C, D Class Test_class: def __init__(self, A, B): self.A = A self.B = B def Test_def (self): return self.A + self.B
● Class 선언이 헷갈린다면
○ https://wikidocs.net/16071 참고바랍니다.
● 변수 할당 앞,뒤에 스페이스를 하나만 사용한다.
● 리스트 인덱스, 함수 호출, 키워드 인수 할당에는
스페이스를 사용하지 않는다.
● Space의 사용 예
# 함수 호출시 좋은예: spam(1) # 함수 호출시 나쁜예: spam (1)
# dict 값 입력시 좋은예: dct['key'] = lst[index] # dict 값 입력시 나쁜예: dct ['key'] = lst [index]
# 변수 선언시 좋은예: x = 1 y = 2 long_variable = 3
# 변수 선언시 나쁜예: x = 1 y = 2 long_variable = 3
● 항상 양쪽에 하나의 공간이 바이너리 연산자를 둘러싸고 : 할당 ( = ), 증강 할당 ( + = , - = 등), 비교 ( == , < , > , ! = , <> , <= , > = , in , not in , is , is not ), 부울 ( and , or , not )
● 우선 순위가 다른 연산자를 사용하는 경우 우선 순위가 가장 낮은 연산자 주위에 공백을 추가하십시오. 자신의 판단을 사용하십시오. 그러나 둘 이상의 공백을 사용하지 말고 항상 이항 연산자의 양쪽에 같은 양의 공백이 있어야합니다.
●
# 좋은예: i = i + 1 submitted += 1 x = x*2 - 1 hypot2 = x*x + y*y c = (a+b) * (a-b)
# 나쁜예: i=i+1 submitted +=1 x = x * 2 - 1 hypot2 = x * x + y * y c = (a + b) * (a - b)
● 복합 문장 (같은 줄에 여러 문장)은
일반적으로 사용하지 않는 것이 좋습니다.
# 좋은예: if foo == 'blah': do_blah_thing() do_one() do_two() do_three()
# 나쁜예: if foo == 'blah': do_blah_thing() do_one(); do_two(); do_three()
● 후행 쉼표가 중복되면 버전 관리 시스템을 사용할 때, 값 목록, 인수 또는 가져온 항목이 시간이 지남에 따라 확장 될 것으로 예상되는 경우 바로 추가하기 쉽고 이해하기 더 쉽습니다.
● 패턴은 각 값을 한 줄에 하나씩 배치하고 항상 뒤에 쉼표를 추가하고 다음 줄에 닫는 괄호 / 괄호를 추가하는 것입니다. 그러나 닫는 구분 기호와 동일한 줄에 후행 쉼표를 사용하는 것은 의미가 없습니다.
# 좋은예: FILES = [ 'setup.cfg', 'tox.ini', ] initialize(FILES, error=True, )
# 나쁜예: FILES = ['setup.cfg', 'tox.ini',] initialize(FILES, error=True,)
● 코드와 모순되는 주석은 주석이없는 것보다 나쁩니다. 코드가 변경 될 때 항상 설명을 최신 상태로 유지하십시오.
● 이항 연산자 전후에 줄바꿈 예제
# 좋은 예제: # 연산자가 Enter후에 나오는경우 income = (gross_wages + taxable_interest + (dividends - qualified_dividends) - ira_deduction - student_loan_interest)
# 나쁜 예제: # 연산자가 Enter전에 나오는 경우 income = (gross_wages + taxable_interest + (dividends - qualified_dividends) - ira_deduction - student_loan_interest)
3. Naming● 함수, 변수, 속성 : lowercase_underscore
● 상수 : MAX_OVERFLOW or TOTAL
● 보호(protected) 인스턴스 속성 : _leading_underscore
(앞에 _(언더바) 한개 추가)
● 비공개(private) 인스턴스 속성 : __double_leading_undersocre
(앞에 __(언더바) 두개 추가)
● 클래스(Class) 와 예외 : CapitalizeWord
● 모듈 수준 상수 : ALL_CAPS
● 클래스의 인스턴스 메서드에서는 첫번째 파라미터 (해당 객체 참조)의 이름을 self로 지정
● 클래스 메서드에서는 첫번재 파라미터 (해당 클래스 참조)의 이름을 cls로 지정
※ 상수 제외 함수, 변수 선언은 소문자가 원칙입니다.
※ Class 선언은 대문자 시작, 예외문자(Ex: Value error)
● File Path 같은 상수는 대문자로 맨 위에 표기
Ex) 처음엔 나쁜예가 편할지는 몰라도 1주일 뒤에 코드를 수정하려면
가독성이 많이 떨어집니다. PATH 같은 경우는 맨위에 선언해놓으면
나중에 다시 사용할때도 PATH만 수정하면 되는 경우가 많습니다.
#좋은예 INPUT_PATH = ‘N://DATA//JBAM/INPUT/’ OUTPUT_PATH = ‘N://DATA//JBAM/OUTPUT/’ INPUT_FILE = ‘INPUT_FILE.csv’ OUTPUT_FILE = ‘OUTPUT_FILE.csv’ data = pd.read_csv(FILE_PATH + INPUT_FILE) data.to_csv(OUTPUT_PATH + OUTPUT_FILE)
#나쁜예: data = pd.read_csv(‘N://DATA//JBAM/INPUT/INPUT_FILE.csv’) data.to_csv(‘N://DATA//JBAM/OUTPUT/OUTPUT_FILE.csv’)
● 파이썬 코드의 명명규칙은 매우 복잡하기에 완전히 일정하게 정하지는 않습니다.그럼에도 최근의 표준 명명법은 있다. 기존에 작성된 코드는 그 코드의 명명법을 따르도록 하고, 앞으로 작성될 코드엔 아래의 규칙을 따르도록 해야 합니다.
3 - 1 Naming Style
● 서로 다른 여러 네이밍 스타일이 존재하며,
똑같을순 없더라도 표준화 하여 사용해야 합니다.
● 아래의 네이밍 스타일은 일반적으로 널리 쓰이는 스타일입니다.
○ b (single lowercase letter)
○ B (single uppercase letter)
○ lowercase
○ lower_case_with_underscores
○ UPPERCASE
○ UPPER_CASE_WITH_UNDERSCORES
○ CapitalizedWords (CapWords, CamelCase, StudlyCaps으로 알려져있기도 하다.)
※ CapWord에서 줄임말을 사용할 때, 줄임말의 글자는 모두 대문자로 사용한다.
○ 예를들어 HttpServerError보다는 HTTPServerError이 더 낫습니다.
○ mixedCase (첫문자가 소문이기 때문에 CapitalizedWords 와는 다릅니다.)
○ Capitalized_Words_With_Underscores
Capital_Words_With_Underscores (언더바 후 대문자)
3 - 2 피해야 할 이름
● 문자 'l'(소문자 소문자 el), 'O'(대문자 oh) 또는 'I'(대문자 눈)를 단일 문자 변수 이름으로 사용하면 안됩니다.
● 일부 글꼴에서 이러한 문자는 숫자 1과 0과 구별 할 수 없습니다. 'l'을 사용하고 싶을 때는 대신 'L'을 사용합니다.
4. 표현식과 문장
● if no a is b 보다는 if a is not b 를 사용 합니다.
● if not somelist 처럼 빈 값은 암시적으로 False가 된다고 가정 합니다.
● if somelist 처럼 값이 있는 리스트는 암시적으로 True가 된다고 가정 합니다.
● 한 줄로 된 if문, for, while loop, except 복합문을 쓰지 않는다.
4 - 1 주석
● 주석처리 예제
#좋은예: # 짧은 주석 처리 """ 긴 주석 처리 """ #나쁜예: # 긴 주석1 # 긴 주석2 # 긴 주석3
● 주석은 코드가 업데이트 될 때마다 반드시 같이 업데이트 해야 합니다.
● 주석은 반드시 완전한 문장형태여야 한다.
만약 주석이 구문이거나 한 문장일 경우, 첫 글자는 대문자를 씁니다. 그러나 이 주석에 사용되는 첫 단어가 소문자 식별자인 경우에는 그대로 소문자를 씁니다.
● 주석이 짧을 경우에는 마침표가 생략될 수 있다. 블록 주석의 경우에는 주로 완전한 문장을 사용하며 문장의 마지막은 마침표로 끝납니다.
● 명백한 상황에서의 주석은 불필요하며
복잡해지는 상황에서는 한줄씩 적어야 합니다.
● 마침표 뒤에는 두 칸의 공백을 줍니다.
※ 주석은 코드가 아니라서 별로 중요하지 않다고 생각하면 안됩니다.
4 - 2 뒤에 오는 콤마(Trailing comma)를 사용할 경우
● 기본적으로 뒤에오는 콤마는 사용자의 선택이다.
○ 하나의 튜플을 하나의 요소로 만들 때처럼 Trailing comma가 의무적으로 사용되어야 하는 상황은 제외된다.
○ 파이썬 2에서는 print구문에서 의미를 가질 경우도 포함된다.
● 명확성을 위해, 의미없는 괄호로 문자를 덮는 것이 권장된다.
#좋은 예 : FILES = ('setup.cfg',) #사용해도 좋지만 헷갈리는 예 : FILES = 'setup.cfg',
4 - 3 변수 주석
● PEP 526는 변수주석을 소개하는 문서임. 변수에 대한 스타일 권장사항은 위에 설명된 함수주석과 유사하다.
● 모듈 레벨 변수, 클래스와 인스턴스 변수, 지역변수에 대한 주석은 콜론 이후 하나의 스페이스를 가진다.
● 콜론 전에는 스페이스가 없다.
● 배정이 오른쪽이라면, 그때에는 이퀄리티 사인은 양쪽에 하나의 스페이스를 가져야 한다.
#좋은 예 : code: int class Point: coords: Tuple[int, int] label: str = '<unknown>'
나쁜 예 : code:int # No space after colon code : int # Space before colon class Test: result: int=0 # No spaces around equality sign
● 뒤에오는 콤마가 의미없는 상황에서, 콤마는 버전 컨트롤 시스템이 사용될 때 혹은 값의 리스트, 독립변수 혹은 imported된 item들이 확장될 것으로 예상될 때 상당히 도움된다.
● 패턴은 각각의 값을 그 라인 위에 놓아야하며, 항상 Trailing comma를 추가하여야 하고, 다음 줄에 닫는 괄호를 놓아야 한다.
● 뒤에 오는 콤마가 닫는 괄호처럼 같은 라인에 있어도 된다는 의미는 아니다.
(하나의 요소를 갖는 튜플은 제외된다.)
#좋은 예 : FILES = [ 'setup.cfg', 'tox.ini', ] initialize(FILES, error=True, )
#사용해도 좋지만 헷갈리는 예 : FILES = ['setup.cfg', 'tox.ini',] initialize(FILES, error=True,)
5. import
● 항상 파일의 맨 위에 import 문을 놓는다.
● 모듈 임포트시에는 항상 모듈의 절대 이름을 사용 import foo 대신 from bar import foo
● 상대적인 임포트를 해야 한다면 명시적인 구문을 서서 from . import foo 라고 한다.
● 모듈은 짧은 소문자 이름을 가져야합니다. 가독성을 높이려면 모듈 이름에 밑줄을 사용할 수 있습니다. 밑줄을 사용하지 않는 것이 좋지만 파이썬 패키지는 모두 소문자로 된 짧은 이름을 가져야합니다.
● import 순서 : 표준 라이브러리 모듈 > 서드파티 모듈 > 자신이 만든 모듈 / 각각의 하위 섹션에서는 알파벳 순서
# 좋은예: import os import sys from subprocess import Popen, PIPE from Test_class import Test_def # 나쁜예: from subprocess import Popen, PIPE from Test_class import Test_def import sys, os
8. 상수(constants)
● 상수는 모듈레벨에서 정의되고, 언더스코어로 구분되어 대문자로 작성됩니다.
○ 예제: MAX_OVERFLOW , TOTAL
○ Public속성은 사용을 위한 클래스의 관련없는 클라이언트라고 예상되는 것이며, 호환되지 않는 변경사항을 피하도록 노력합니다.
○ Non-public 속성은 서드파티에 의해 사용되지 않는 것입니다.
■ Non-public 속성은 바뀌지 않거나 제거되지 않는다는 것이 보장되지 않습니다.
○ 파이썬에서는 “private” 속성이 없기 때문에, “private”라는 용어를 여기서는 사용하지 않습니다.
○ 위와 관련하여 파이썬 다운 가이드라인이 아래에 제시됩니다.
■ Public 속성은 이름앞에 _언더스코어를 가지지 않습니다.
■ 만약 public 속성 이름이 예약된 키워드와 충돌한다면, 이름 뒤에 하나의 언더스코어(_)를 붙이도록 합니다. 이것은 축약형이나 스펠링을 파괴하는 것보다 선호되는 방법입니다.
9. 함수선언
● 람다 표현식을 식별자에 직접 바인드하는 할당문 대신에 항상 def 문을 사용하도록 합니다.
#좋은 예 : def f(x): return 2*x #나쁜 예 : f = lambda x: 2*x
○ 첫번째 형태는 결과함수 오브젝트의 이름이 ‘<lambda>’가 아니라 ‘f’ 인 것을 의미합니다.
○ 일반적으로 트레이스백과 문자열(string) 표현에 대해서는 이것이 더 유용합니다.
○ 할당문의 사용은 람다표현식이 제공하는 def구문보다 더 유리한 장점을 제거합니다.
10. 빈줄
● 가장 높은 위치에 있는 함수와 클래의 정의 사이에는 2개의 줄바꿈을 사용하도록 합니다.
● 클래스 내부의 메서드 정의는 위 아래로 줄바꿈을 사용하여 구분하도록 합니다.
● 추가적인 빈줄은 연관된 함수들의 그룹을 분리하는데 사용됩니다.
● 줄바꿈은 한줄 짜리 묶음사이에서는 생략될 수 있습니다.
● 함수내에 논리 섹션을 나타내기 위해 빈줄을 사용할 수 있으나, 적당히 사용하도록 합니다.
11. 예외 설정(Error)
● 예외를 선정할 때, 가능하다면 except:를 사용하는 것 보단 특정한 예외를 언급하도록 합니다.
try: import platform_specific_module except ImportError: platform_specific_module = None
● 가장 좋은 규칙은 아래의 두 케이스에서 bare ‘except’ 구문의 사용을 제한하도록 합니다
● 만약 예외 핸들러가 트랙백을 출력하거나 로그를 만든다면, 최소 사용자는 에러가 났다는 것을 알 것입니다.
○ 만약 코드가 정리작업 필요하다면, 그러나 그때에 예외가 raise를 사용해서 다음에 전파하지 못하게 만듭니다.
○ try...finally가 이런 케이스를 다루기 위해서는 더 나은 방법입니다.
try: process_data() except Exception as exc: raise DataProcessingFailedError(str(exc))
○ 이것은 파이썬 3에서만 지원되는 구문이고, 오래된 콤마 기반 구문과 연관된 애매한 문제들을 피하게 할 수 있습니다.
● 작동 시스템 에러를 잡을때, errno 값의 인트로 스팩션을 통해 파이썬 3.3에서는 explicit 예외 계층을 선호하도록 한다.
● 모든 try/except 구문에 대해, try 구문의 절대적인 수를 최소한으로 제한하도록 한다.
○ 다시 설명하면, 이것은 버그를 감출수 없게 한다.
#좋은 예 : try: value = collection[key] except KeyError: return key_not_found(key) else: return handle_value(value)
#나쁜 예 : try: # Too broad! return handle_value(collection[key]) except KeyError: # Will also catch KeyError raised by handle_value() return key_not_found(key)
개인적으로 공부하면서 추가한 부분도 있습니다.
실제로 코딩하면서 사용되는 부분만 집어서 정리했습니다.
감사합니다.
반응형'Programming > Python' 카테고리의 다른 글
Python 기초 공부 - 4 (0) 2021.03.06 Python 기초 공부 - 3 (0) 2021.03.05 Python 기초 공부 - 2 (0) 2021.03.04 Python 기초 공부 - 1 (0) 2021.03.04 Flask를 이용하여, 웹 구축 - 1 (0) 2020.09.06