Language/Python

[Python] Code convention

ooeunz 2019. 10. 10. 14:32
반응형

convention 이란?

code convention이란 코드를 짤 때 어떻게 코드를 짤지 다수가 합의한 약속이다. code convention을 지키지 않는다고 해서 에러가 나는 것은 아니지만, 팀 프로젝트에서 통일된 코드는 읽기가 쉽고 유지보수 측면에서 뛰어나다.

아래는 code convention을 지킨 것과 지키지 않은 것들인데 모두 같은 결과 값을 출력한다.

변수를 만들 때에는 = 양옆으로 띄어쓰기를 하자
O : my_list = []
X : my_list=[]

상수는 대문자로 만들자
O: MY_CONSTANT = 300
X: myconstant = 300

주석을 쓸 때에는 # 뒤에 공백 문자를 하나 넣자
O: # 2를 곱한다
X: #2를 곱한다

 

코드로 개성을 드러내지 말자.

convention을 따르지 않는 코드를 보면 아래와 같은 인상을 남긴다.

 

1. 작성자가 코딩을 많이 해보지 않았다.

2. 언어에 대한 이해가 낮아 보인다.

3. 작성자와 협업하기 힘들다.

 

아래는 이것만큼의 지키자 정도의 convention을 나열해보았다. 더 자세한 정보를 얻고 싶다면 아래 링크를 참조하자.

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

 

PEP 8 -- Style Guide for Python Code

The official home of the Python Programming Language

www.python.org

 

띄어쓰기를 하자

1. 연산자 앞뒤로 띄어쓰기

다음 연산자 앞 뒤로는 띄어쓰기를 한다.

산술 연산자
+, -, *, /, %, **, //

비교 연산자
==, !=, <>, >, <, >=, <=

대입 연산자
=, +=, -=, *=, /=, %=, **=, //=

논리 연산자
AND, OR, NOT

멤버십 연산자
in, not in

아이덴티티 연산자
is, is not
1
2
3
4
5
6
7
8
# 올바르지 않은 예 - 연산자 앞뒤로 띄어쓰기가 없음
my_list=3
value = my_list*2
 
 
# 올바른 예 - 연산자 앞뒤로 띄어쓰기가 있음
my_list = 3
value = my_list * 2
cs

단, 우선순위가 다른 연산자가 있는 경우엔 우선순위가 높은 연산자는 붙여 쓰는 걸 권장한다.

1
2
3
4
5
6
7
8
9
= 3
= 5
 
# 올바르지 않은 예
distance = x * x + y * y
 
 
# 올바른 예
distance = x*+ y*y
cs

 

2. 주석을 쓸때는 띄어쓰기

주석을 쓸 때에는 # 뒤에 꼭 띄어쓰기를 한다.

1
2
#올바르지 않은 예 - # 뒤에 띄어쓰기가 없음
# 올바른 예 - # 뒤에 띄어쓰기가 있음
cs

 


띄어쓰기를 하지 말자

1. 키워드 인자에 값을 넣거나 기본값을 설정하는 = 연산자 앞뒤

1
2
3
4
5
6
7
8
9
10
11
# 올바르지 않은 예
def my_function(value = 3):
  return value * 2
 
my_function(value = 5)
 
# 올바른 예
def my_function(value=3):
  return value * 2
 
my_function(value=5)
cs

 

2. 소/중/대괄호를 연 바로 뒤에

1
2
3
4
5
6
7
# 올바르지 않은 예 - 괄호를 연 후 바로 띄어쓰기가 있음
my_dict = { 13 }
my_value = my_dict[ 1 ]
 
# 올바른 예
my_dict = {13}
my_value = my_dict[1]
cs

 

3. 쉼표, 콜론, 세미콜론 앞에

✘ 단, slice에서 쓰이는 콜론의 앞에는 띄어쓰기가 있어도 됨. ex) my_list[1 : 3]

1
2
3
4
5
# 올바르지 않은 예 - 콜론 앞에 띄어쓰기가 있음
if True : print(3)
 
# 올바른 예
if True: print(3)
cs

Boolean은 이렇게 다루자

1. 비교 연산자를 쓰지 말자(1)

이런 코드는
if value == True:
    어쩌고

이렇게 바꾼다.
if value:
    어쩌고
1
2
3
4
5
6
7
8
9
10
11
12
# 올바르지 않은 예
def my_function(value):
  if value == True:
    return 5
  else:
    return 3
  
# 올바른 예
def my_function(value):
  if value:
    return 5
  return 3
cs

 

2. 비교 연산자를 쓰지 말자 (2)

이런 코드는
if value == False:
    어쩌고

이렇게 바꾼다.
if not value:
    어쩌고
1
2
3
4
5
6
7
8
9
10
11
12
13
# 올바르지 않은 예
 
def my_function(value):
  if value != True:
    return 5
  else:
    return 3
  
# 올바른 예
def my_function(value):
  if not value:
    return 5
  return 3
cs

 

3. 리턴할 때 이러지 말자

이런 코드는
if value == 복잡한 수식:
    return True
else:
    return False

이렇게 바꾼다.
return value == 복잡한 수식
1
2
3
4
5
6
7
8
9
10
# 올바르지 않은 예
def my_function(value):
  if value != 3:
    return True
  else:
    return False
  
# 올바른 예
def my_function(value):
  return value != 3
cs

Index 접근은 최소한으로

인덱스를 이용해 접근하면 Boundary 에러가 날 확률이 높다. 꼭 필요한 경우가 아니라면 index 접근을 자제해야 한다. 값과 인덱스를 모두 사용해야 한다면 enumerate() 함수를 이용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 리스트에서 5를 제외한 원소를 더하는 코드
my_list = [1,2,5,4,5,6]
 
# 올바르지 않은 예 - index 값을 이용해 접근
summation = 0
for i in range(len(my_list)):
  if i == 5:
    continue
  summation += my_list[i]
 
# 올바른 예 - enumerate를 사용
summation = 0
for idx, value in enumerate(my_list):
  if idx == 5:
    continue
  summation += value
cs

 

 


None을 검사할 때는 is, is not을 사용하자

None을 검사할 때에는 비교 연산자 ==, !=가 아니라 is, is not을 사용한다.

1
2
3
4
5
6
7
8
9
my_None = None
 
# 올바르지 않은 예
if my_None != None:
  print(5)
 
# 올바른 예
if my_None is not None:
  print(5)
cs

 


예외 처리를 control flow 용으로 쓰지 말자

예외 처리는 에러 상황을 대처할 때에만 사용하는 편이 좋다. 논리적인 흐름을 처리할 때에 예외처리를 이용하지 말고, if 문을 이용하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 현재 값이 앞 원소와 비슷한지 검사하는 코드
 
# 올바르지 않은 예
def my_function(my_list):
  answer = []
  for i in range(len(my_list)):
    # i == 0 일때에는 앞 원소가 없으므로 예외 처리
    try:
      answer.append(my_list[i] == my_list[i - 1])
    except:
      answer.append(False)
 
# 올바른 예
def my_function(my_list):
  answer = []
  for i in range(len(my_list)):
    if i == 0:
      answer.append(False)
      continue
    answer.append(my_list[i] == my_list[i - 1])
cs

 


쓰지 않는 값은 _ 로 처리

쓰지 않는 값은 _ 로 표기한다.

1
2
3
4
5
6
7
8
9
# 올바르지 않은 예 - for 블록에서 i가 쓰이지 않음
answer = 1
for i in range(10):
  answer += answer + 1
  
# 올바른 예
answer = 1
for _ in range(10):
  answer += answer + 1
cs

 

반응형