ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 전체 가이드

         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
Designed by Tistory.