이끼의 생각

PEP 8 (2) Code Lay-out (작성중) 본문

개발자의, 개발자에 의한, 개발자를 위한/내 멋대로 번역한 PEP8

PEP 8 (2) Code Lay-out (작성중)

IKKIson 2019. 12. 28. 16:57

Code Lay-out


(작성중입니다.

최종수정일 : 2020년 3월 22일)


1. Indentation 들여쓰기


들여쓰기는 4개 공백으로 사용합니다. 스페이스바 4번.


코드를 작성할 때 1줄에 끝나지 않고 2줄 이상 여러 줄에 걸쳐 작성하는 괄호 ( ), 중괄호 { }, 대괄호 [ ] 같은 파이썬에서 암시적으로 여러 줄을 결합하는 기능을 사용하거나, Hanging Indent를 사용해서 괄호/중괄호/대괄호, 들여쓰기로 감싸진 코드의 요소들을 수직으로 정렬해야됩니다.


Hanging Indent

내어쓰기는 첫 줄을 제외한 단락의 모든 줄에 들여쓰기되는 형식-설정 스타일입니다. 글을 쓸 때 의미를 명확하게 표현하기 위해 왼쪽끝에서 일정 간격으로 내어 쓰는 것입니다. 

파이썬의 맥락에서는 여는 괄호가 있는 첫줄을 제외하고 마지막 괄호까지 괄호 안의 문장에 계속 들여쓰기를 하는 방법입니다.

(PEP8 공식문서의 내용과 다르며 쉽게 적어보았습니다.)



좋은 예 1)


# Aligned with opening delimiter. foo = long_function_name(var_one, var_two, var_three, var_four)

구분자 delimiter 를 사용한 정렬.



좋은 예 2)


# Add 4 spaces (an extra level of indentation) to distinguish arguments from the rest.
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

들여쓰기를 추가하여 나머지 코드들과 구분한다.



좋은 예 3)


# Hanging indents should add a level.
foo = long_function_name(
    var_one, var_two,
    var_three, var_four)

hanging indent 로 첫줄보다 1레벨을 반드시 추가한다. (들여쓰기 1회 필수)



나쁜 예 1)


# Arguments on first line forbidden when not using vertical alignment. foo = long_function_name(var_one, var_two, var_three, var_four)

long_function_name 함수의 3, 4번째 파라미터들을 1, 2번째 파라미터들과 수직 정렬을 하지 않았습니다.

이러한 경우 파라미터들을 첫번째 줄에 사용하지 않거나, 수직정렬을 하면됩니다.



나쁜 예 2)


# Further indentation required as indentation is not distinguishable.
def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)

다음 행(마지막에 사용한 print함수)과 구별이 안되므로 추가 들여쓰기를 반드시 해야됩니다.



선택사항)


# Hanging indents *may* be indented to other than 4 spaces.
foo = long_function_name(
  var_one, var_two,
  var_three, var_four)

hanging indent를 추가로 사용 안해도 되는 상황입니다.




if-else 조건문을 사용 시 if 구문의 조건부 내용이 길어 여러 줄에 걸쳐 작성될 경우

if, 공백 1칸, 여는 괄호 들의 칸수 만틈 들여쓰기를 한 후에 4칸 들여쓰기를 하여 조건문들을 표현하여야 되는데, 앞서 함수호출시에 적용한 방법대로 하면 if 조건문들과 if 내부의 코드들을 구분하기 어려워 큰 혼란을 가져옵니다. 


문법상의 문제는 없지만 가독성에 문제가 생기므로 PEP8에서는 if의 조건문과 if내부 코드를 구분하기 위해 여러 선택사항을 제공합니다.


# No extra indentation. if (this_is_one_thing and that_is_another_thing): do_something()

if 아랫줄의 조건문에 들여쓰기를 사용하지 않았습니다.

앞서 애기한 혼란을 줄 가능성이 있는 상황입니다.



# Add a comment, which will provide some distinction in editors
# supporting syntax highlighting.
if (this_is_one_thing and
    that_is_another_thing):
    # Since both conditions are true, we can frobnicate.
    do_something()

들여쓰기를 사용하지않았지만, 주석을 추가하여 if 내부 코드를 구분해줍니다.



# Add some extra indentation on the conditional continuation line.
if (this_is_one_thing
        and that_is_another_thing):
    do_something()

추가적인 들여쓰기를 사용하여 조건문과 if 내부 코드를 구분합니다.




list와 같이 대괄호를 사용하는 경우처럼 여러 줄에 걸치 괄호(괄호/중괄호/대괄호)의 마지막 줄에서 생성자같은 첫번째 문자가 시작되는 위치에 닫는 괄호를 넣어도 됩니다.


my_list = [
    1, 2, 3,
    4, 5, 6,
]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
)


혹은, 닫는 괄호를 마지막줄의 공백없이 list를 사용한 줄의 첫번째 문자위치에 놓습니다.


my_list = [
    1, 2, 3,
    4, 5, 6,
    ]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
    )




2. Tabs or Spaces 탭? 스페이스?


파이썬에서 선호하는 들여쓰기 방법은 Spaces 입니다.  그렇다고 Tabs을 아예 사용 안하는 것이 아닙니다. Tabs은 파이썬에서 이미 들여쓰기가 된 코드와 일관성을 유지하기 위헤서만 사용해야 됩니다.


Python 3 에서는 들여쓰기를 위해 탭과 공백을 섞어서, 임의로 선택하여 사용할 수 없습니다.


Python 2 에서, 탭과 스페이스가 혼합된 들여쓰기가 있으면 스페이스로만 변환해야 됩니다. 파이썬 2 코드를 Commandar(or Terminal)환경의 인터프리터를  -t 옵션과 함께 실행하면 탭과 스페이스를 잘못 혼합하된 코드에 대해 경고를 알려줍니다. 그리고 -tt 옵션을 사용하면 이 경고가 오류가 됩니다. 이 옵션들은 파이썬 PEP8에서 적극 권장하는 부분이죠. 


결국, 절대 탭과 스페이스를 섞어 쓰면 안됩니다.

탭을 사용하더라도 탭이 스페이스 4칸으로 변환되어야 인터프리터 실행 시 오류가 나지 않죠.




3. Maximum Line Length


파이썬 코드를 작성할 때 한 행에 최대 글자수는 79자까지만 넣도록 합니다.

DocString이나 주석 등 구조적 제한이 적은 긴 텍스트 블럭이, 72자 까지 쓰도록 제한합니다.


이렇게 글자수를 79자로 제한하면 코딩 시 필요한 에디터의 창 너비를 제한하면서 여러개의 파일들을 나란히 열어서 작업할 수 있습니다. 인접한 열의 두 버전을 표시해주는 검토 도구들을 사용할 때 잘 작동합니다.


대부분의 툴에서 자동 줄바꿈 기능(wrapping)은 코드의 시각적인 구조를 방해하여 이해하기 더 어려워집니다. 그래서 소스코드는 79자, 주석 등은 72자 제한을 권장하네요.


툴이 줄바꿈을 할때 마지막 열에 기호(Marker Glyph)를 놓더라도, 창 너비를 80으로 설정된 에디터에서 줄바꿈을 하지안도록 제한을 정한다. Marker Glyph 와 어설픈 영어 실력으로 뇌절...ㅠㅠ


어떤 팀들은 줄 길이가 더 긴걸 선호합니다. 이 줄 길이 이슈를 합의할 수 있는 팀이 전용으로 혹은 주로 유지하는 코드의 경우, 줄길이를 99까지 늘려도 OK다.(Comments, DocString 72글자 포함)


Python 표준 라이브러리는 보수적이며 이 역시 79자로 제한합니다.(Comments, DocString 72글자 제한)


글자가 많아 줄이  긴 경우 줄바꿈할 때 가장 선호하는 방법은 괄호, 중괄호, 대괄호 등의 내부에 여러 행의 코드를 적는 것입니다. 긴줄은 괄호로 묶으면 여러 줄로 바꿀 수 있습니다. 이렇게 여러행으로 나누면 파이썬에서는 이를 암시적으로 계속 이어지는 것으로 처리됩니다.

이 방법은 코드 라인이 계속 이어진다는 것을 위해 나타내기 위해 사용하는 백슬래쉬를 사용하기 전에 줄바꿈을 사용하면 좋습니다.


가끔 백슬래쉬가 여전히 적절한 사용인데, 예를들어 길고 다중 구문(if 의 다중 조건문 등등)이 포함된 경우엔 암묵적으로 길게 작성할 수 없으므로, 백슬래쉬로 줄바꿈 하면 적절합니다.


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())

with 블록에서 open() 함수 2개를 슬래쉬와 앞서 애기한 들여쓰기를 적용하여 작성하였습니다.


(다중 구문에 관한 방법은 위에서 애기한 if 다중 구문에 관한 애기를 참조하면 됩니다.)

또다른 경우는 assert 키워드를 사용할 때입니다.

assert의 조건부에서 백슬래시가 유용하며, 연속되는 문장, 다중 조건문 등은 들여쓰기를 적절하게 사용하여 명확하게 작성해야 됩니다.



4. Should a Line Break Before or After a Binary Operator?


이진 연산자에서 줄바꿈을 할 경우엔 연산자 다음의 위치에서 줄바꿈을 하는 것이 좋습니다.

class Rectangle(Blob):

    def __init__(self, width, height, color='black', emphasis=None, highlight=0):

        if (width == 0 and height == 0 and 

            color == 'red' and emphasis == 'strong' or

            highlight > 100):

            raise ValueError("sorry, you lose")

        if width == 0 and height == 0 and (color == 'red' or

                                                        emphasis is None):

            raise ValueError("I don't think so -- values are %s, %s" %

                                  (width, height))

        Blob.__init__(self, width, height, 

                         color, emphasis, highlight)




수년 동안 권장되는 스타일은 이진 연산자 다음에 줄넘김을 하는 것이였는데, 가독성을 떨어트리는 2가지 이유가 있습니다.

1. 연산자들이 화면에서 서로 다른 열에 흩어지는 경향. (1열로 있지 않음)

2. 각 연사자들은 연산을 해야되는 피연산자들(ex 변수들)의 이전행으로 옮겨짐.


이렇게 되면 어떤것들이 더해지고 빼지는지 여러분들의 눈만 바빠집니다


# No: operators sit far away from their operands
income = (gross_wages +
          taxable_interest +
          (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)


이런 가독성이 떨어진는 문제를 해결하기 위해 




**출처**

PEP8 - https://www.python.org/dev/peps/pep-0008/

https://kenial.tistory.com/902

내어쓰기 네이버 국어사전 - https://ko.dict.naver.com/#/entry/koko/e4c1050d576a412387ccec9380958923

Comments