๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ Python/python-programming

[python] PEP 8(์ฝ”๋”ฉ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ) -- Style Guide for Python Code & ํŒŒ์ด์ฌ์˜ ๋ณ€์ˆ˜ ์ด๋ฆ„ ๊ทœ์น™

1.  PEP8์ด๋ž€

ํŒŒ์ด์ฌ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ PEP8๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋‹ค.

This document gives coding conventions for the Python code comprising the standard library in the main Python distribution. Please see the companion informational PEP describing style guidelines for the C code in the C implementation of Python. - python PEP8 Introduction 
PEP8์€ "python ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ฝ”๋”ฉ ๊ทœ์น™"์„ ์ œ๊ณตํ•œ๋‹ค.

๊ณต์‹ ๋ฌธ์„œ ๋‚ด์šฉ์„ ํ™•์ธํ•ด ๋ณด๋ฉด, python์„ ๋งŒ๋“  Guido van Rossum(๊ท€๋„ ๋ฐ˜ ๋กœ์„ฌ) ์„ ์ƒ๋‹˜์„ ํฌํ•จํ•œ ์„ธ ๋ถ„์ด ์ž‘์„ฑํ•˜์‹  "ํŒŒ์ด์จ๋‹‰(pythonic)ํ•œ ์ฝ”๋“œ"๋ฅผ ์œ„ํ•œ ๊ฐ€์ด๋“œ์ด๋‹ค. 

๊ฐœ๋ฐœ์€ ํ˜ผ์ž ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€๋…์„ฑ ์žˆ๊ณ  ์ผ๊ด€์„ฑ ์žˆ๋Š” ์ฝ”๋“œ๋Š” ํ†ตํ•ด ํ˜‘์—… ๊ฐ„ ๋งค์šฐ ์ค‘์š”ํ•œ ์š”์†Œ์ด๋‹ค.


2.  ์ฃผ์š” ๊ฐ€์ด๋“œ

1. ์ด๋ฆ„ ๊ทœ์น™

1) ๋ชจ๋“  ๋ณ€์ˆ˜[๊ฐ์ฃผ:1]์™€ ํ•จ์ˆ˜ ์ด๋ฆ„์€ ์†Œ๋ฌธ์ž๋กœ ์“ฐ๊ณ , ์—ฌ๋Ÿฌ ๋‹จ์–ด์ผ ๊ฒฝ์šฐ _ ๋กœ ๋‚˜๋ˆˆ๋‹ค.

# bad
someVariableName = 1
SomeVariableName = 1


def someFunctionName():
    print("Hello")


# good : ์ถ”์ƒํ™”๋ฅผ ์ž˜ํ•œ ์˜ˆ๋Š” ์•„๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋‹จ์–ด์˜ ๊ตฌ๋ถ„์„ _๋กœ ์ž˜ํ•œ ์˜ˆ
some_variable_name = 1


def some_function_name():
    print("Hello")

2) ๋ชจ๋“  ์ƒ์ˆ˜ [๊ฐ์ฃผ:2] ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์“ฐ๊ณ , ์—ฌ๋Ÿฌ ๋‹จ์–ด์ผ ๊ฒฝ์šฐ _ ๋กœ ๋‚˜๋ˆˆ๋‹ค.

# bad
someConstant = 3.14
SomeConstant = 3.14
some_constant = 3.14

# good : ์ถ”์ƒํ™”๋ฅผ ์ž˜ํ•œ ์˜ˆ๋Š” ์•„๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๋‹จ์–ด์˜ ๊ตฌ๋ถ„์„ _๋กœ ์ž˜ํ•œ ์˜ˆ
SOME_CONSTANT = 3.14

# excellent : ์ถ”์ƒํ™”๊นŒ์ง€ ์ž˜ํ•œ ์˜ˆ
PI = 3.14

2. ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„ : ์ถ”์ƒํ™”

์ถ”์ƒํ™”๋ž€ ๋ณต์žกํ•œ ๋‚ด์šฉ์€ ์ˆจ๊ธฐ๊ณ , ํ•„์ˆ˜ ์ฃผ์š” ๊ธฐ๋Šฅ์—๋งŒ ์‹ ๊ฒฝ์“ฐ๋Š” ๊ฒƒ - ์ฐธ๊ณ  : [OOP] (4) ์ถ”์ƒํ™”(Abstraction)
  • ํด๋ž˜์Šค, ๋ณ€์ˆ˜, ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์„ ์–ด๋””์— ์“ธ ์ˆ˜ ์žˆ๊ณ , ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์ง๊ด€์ ์œผ๋กœ ์œ ์ถ”๋˜๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ž
  • ํ•„์ž๊ฐ€ ์ฝ”์„ธ๋ผ์—์„œ ํŒŒ์ด์ฌ ๊ฐ•์˜์—์„œ ๋ฐฐ์šด ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ๋‹ˆ๋ชจ๋‹‰(mnemonic)ํ•˜๊ฒŒ ์ง“๋Š” ๊ฒƒ๋„ ์—ฌ๊ธฐ์— ํ•ด๋‹น๋œ๋‹ค.
  • ๐Ÿฅ•๋‹ˆ๋ชจ๋‹‰ ๋ณ€์ˆ˜ ์ด๋ฆ„(mnemonic varaiable name) : ๋ณด๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ ์ ˆํžˆ ์„ ํƒ๋œ ๋ณ€์ˆ˜ ์ด๋ฆ„, ๊ธฐ์–ตํ•˜๊ธฐ ์‰ฌ์šด
## --- ์ƒ์ˆ˜, ๋ณ€์ˆ˜ ---
# bad (์˜๋ฏธ ์—†๋Š” ์ด๋ฆ„)
a = 2
b = 3.14
print(b * a * a)

# good (์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„)
radius = 2 # ๋ณ€์ˆ˜
PI = 3.14 # ์ƒ์ˆ˜๋Š” ๋Œ€๋ฌธ์ž๋กœ
print(PI * radius * radius)

## --- ํ•จ์ˆ˜ ---
# bad (์˜๋ฏธ ์—†๋Š” ์ด๋ฆ„)
def do_something():
    print("Hello, world!")


# good (์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„)
def say_hello():
    print("Hello, world!")

3. ํ™”์ดํŠธ ์ŠคํŽ˜์ด์Šค(white space) ์‚ฌ์šฉ 

1) ๋“ค์—ฌ์“ฐ๊ธฐ : ๋“ค์—ฌ์“ฐ๊ธฐ๋Š” ๋ฌด์กฐ๊ฑด ์ŠคํŽ˜์ด์Šค 4๊ฐœ๋ฅผ ์‚ฌ์šฉ

# Wrong(์ŠคํŽ˜์ด์Šค 2๊ฐœ):
def do_something():
  print("Hello, world!")


# Correct(์ŠคํŽ˜์ด์Šค 4๊ฐœ):
def say_hello():
    print("Hello, world!")โ€‹

 

2) ํ•จ์ˆ˜ ์ •์˜ : ํ•จ์ˆ˜ ์ •์˜ ์œ„์•„๋ž˜๋กœ ๋นˆ ์ค„์ด ๋‘ ๊ฐœ ์”ฉ ์žˆ์–ด์•ผ ํ•จ. 

# Wrong:
def add(x, y):
    return x + y
def subtract(x, y):
    return x - y

def multiply(x, y):
    return x * y

# Correct:
def add(x, y):
    return x + y
    
    
def subtract(x, y):
    return x - y


def multiply(x, y):
    return x * y

 

3) ๊ด„ํ˜ธ ์•ˆ : ๊ด„ํ˜ธ ๋ฐ”๋กœ ์•ˆ์—๋Š” ๋„์–ด์“ฐ๊ธฐ๋ฅผ ํ•˜์ง€ ์•Š์Œ

# Wrong:
spam( ham[ 1 ], { eggs: 2 } )

# Correct:
spam(ham[1], {eggs: 2})

 

4) ํ•จ์ˆ˜ ๊ด„ํ˜ธ : ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ถœํ•  ๋•Œ, ํ•จ์ˆ˜ ์ด๋ฆ„๊ณผ ๊ด„ํ˜ธ ์‚ฌ์ด์— ๋„์–ด์“ฐ๊ธฐํ•˜์ง€ ์•Š์Œ

# Wrong:
def spam (x):
    print(x + 2)


spam (1)

# Correct:
def spam(x):
    print(x + 2)


spam(1)

 

5) ์‰ผํ‘œ : ์‰ผํ‘œ ์•ž์—๋Š” ๋„์–ด์“ฐ๊ธฐ๋ฅผ ํ•˜์ง€ ์•Š์Œ

# Wrong:
print(x , y)

# Correct:
print(x, y)

 

6) ์ง€์ • ์—ฐ์‚ฐ์ž(=) : ์ง€์ • ์—ฐ์‚ฐ์ž ์•ž๋’ค๋กœ ๋„์–ด์“ฐ๊ธฐ๋ฅผ ํ•˜๋‚˜์”ฉ๋งŒ ํ•ด์ค€๋‹ค.

# Wrong:
x=1
x    = 1

# Correct:
x = 1

 

7) ์—ฐ์‚ฐ์ž[๊ฐ์ฃผ:3] : ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฐ์‚ฐ์ž ์•ž๋’ค๋กœ ๋„์–ด์“ฐ๊ธฐ๋ฅผ ํ•˜๋‚˜์”ฉ๋งŒ ํ•ด์ค€๋‹ค.

                 (์—ฐ์‚ฐ์˜ "์šฐ์„ ์ˆœ์œ„"๋ฅผ ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์—ฐ์‚ฐ์ž ์•ž๋’ค๋กœ ๋„์–ด์“ฐ๊ธฐ ๋ถ™์ด๋Š” ๊ฒƒ ๊ถŒ์žฅ)

# Wrong:
i=i+1
submitted +=1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)

# Correct:
i = i + 1
submitted += 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)

 

8) ์ฝ”๋ฉ˜ํŠธ : ์ผ๋ฐ˜ ์ฝ”๋“œ์™€ ๊ฐ™์€ ์ค„์— ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์“ธ ๊ฒฝ์šฐ, ์ฝ”๋ฉ˜ํŠธ ์•ž์— ๋„์–ด์“ฐ๊ธฐ ์ตœ์†Œ ๋‘ ๊ฐœ

# Wrong:
x = x + 1# ์ฝ”๋ฉ˜ํŠธ

# Correct:
x = x + 1  # ์ฝ”๋ฉ˜ํŠธ

๐Ÿ“Ž Variable in python : ์ถ”๊ฐ€ ํ•™์Šต

variable : ๋ณ€์ˆ˜(่ฎŠๆ•ธ)๋Š” ๋ณ€ํ•˜๋Š” ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž๋‹ค. ๋‹ค์–‘ํ•œ ๊ฐ’์ด๋‚˜ ์–‘์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋นˆ ์ž๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธฐํ˜ธ๋กœ ์ข…์ข… ์ฃผ์–ด์ง„ ์ง‘ํ•ฉ์— ์žˆ๋Š” ์ž„์˜์˜ ์›์†Œ๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋•Œ ์“ด๋‹ค. ๋ณ€์ˆ˜๋Š” ์ˆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฒกํ„ฐ, ํ–‰๋ ฌ๊ณผ ํ•จ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋•Œ๋„ ์“ด๋‹ค. - ์œ„ํ‚ค๋ฐฑ๊ณผ

๊ฐ์ฃผ์—์„œ๋„ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ณณ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค. ํŒŒ์ด์ฌ์—์„œ =๋Š” ๊ฐ’์„ "ํ• ๋‹นํ•œ๋‹ค", "์ €์žฅํ•œ๋‹ค"์˜ ์˜๋ฏธ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. 

ํŒŒ์ด์ฌ์—๋Š” ๋ณ€์ˆ˜๋ช…์— ๋Œ€ํ•œ ๊ทœ์น™์ด ์žˆ๋‹ค.

  • ์˜๋ฌธ์ž, ์ˆซ์ž, _(์™ธ์˜ ๊ธฐํ˜ธ๋Š” ๋ถˆ๊ฐ€)์˜ ์กฐํ•ฉ์œผ๋กœ๋งŒ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ
  • ์ฒซ๊ธ€์ž๋Š” ์ˆซ์ž ๋ถˆ๊ฐ€, ๋„์›Œ์“ฐ๊ธฐ ๋ถˆ๊ฐ€
  • ์˜์–ด ๋Œ€๋ฌธ์ž์™€ ์†Œ๋ถ„์ž๋ฅผ ๊ตฌ๋ถ„ํ•จ โžก๏ธ ๊ฐ€๋Šฅํ•œ ์†Œ๋ฌธ์ž ์‚ฌ์šฉ ๊ถŒ์žฅ
  • ๋‹ˆ๋ชจ๋‹‰ํ•œ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ž(mnemonic varaiable name)
  • ์˜ˆ์•ฝ์–ด(reserved words)๋Š” ๋ณ€์ˆ˜์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ์ฃผ์˜(35๊ฐœ) : ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•จ
    and  del  global  not  with  as  elif  if  or  yield
    assert  else  import  pass  break  except  in raise
    class finally  is  return  continue  for  lambda 
    try  def  from  nonlocal  while True False None continue

๐Ÿฅ• TIP

  • ๋‹ˆ๋ชจ๋‹‰ํ•œ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์ง“๋Š” ๊ฒƒ์ด ์–ด๋ ค์šธ ๋•Œ๋Š” ์˜์–ด์‚ฌ์ „, ์˜์–ด ์œ ์˜์–ด ์‚ฌ์ „์„ ์ด์šฉํ•˜์ž
  • ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ, 2๊ฐœ ์ด์ƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค
    # 1๊ฐœ ๋ณ€์ˆ˜ ์ •์˜
    num = 1
    
    # 2๊ฐœ ์ด์ƒ ๋ณ€์ˆ˜ ์ •์˜
    num1, num2 = 1, 2โ€‹

๐Ÿ” Scope(๋ฒ”์œ„) : ๋ณ€์ˆ˜์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„

  1. ๋กœ์ปฌ ๋ณ€์ˆ˜(local vatiable)
    • ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•œ ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ(parameter)๋„ ๋กœ์ปฌ ๋ณ€์ˆ˜
    • ๋กœ์ปฌ ๋ณ€์ˆ˜์˜ scope๋Š” ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด๋กœ ๊ตญํ•œ๋จ
  2. ์ „์—ญ ๋ณ€์ˆ˜, ๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜(global vatiable)
    • ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜์˜ scope๋Š” ์ฝ”๋“œ ์ „์ฒด
# example
x = 2 # ๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜
def my_function():
    x = 3 # ๋กœ์ปฌ ๋ณ€์ˆ˜
    print(x)

my_function() # out: 3
print(x) # out: 2

์กฐ๊ธˆ ๋” ์ „๋ฌธ์ ์ธ, ํŒŒ์ด์จ๋‹‰ํ•œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ๊ผญ ์ง€๋…€์•ผ ํ•  ๋•๋ชฉ์ธ PEP8 ๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€๋กœ ํŒŒ์ด์ฌ์—์„œ์˜ ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.

๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์™€ ํ˜‘์—… ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ๊ฐ„์— ๊ผญ ์ฐธ๊ณ ํ•ด์•ผํ•  ์ข‹์€ ์ฐธ๊ณ ์„œ์ด๋‹ค. :) 


๐Ÿ“Ž Reference

๐Ÿ“Ž ๊ฐ์ฃผ

  1.  variable : ๋ณ€์ˆ˜(่ฎŠๆ•ธ)๋Š” ๋ณ€ํ•˜๋Š” ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž๋‹ค. - ์œ„ํ‚ค๋ฐฑ๊ณผ โžก๏ธ ๐Ÿฅ• ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ณณ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค. [๋ณธ๋ฌธ์œผ๋กœ]
  2. constant : ์ƒ์ˆ˜๋ž€ ์ˆ˜์‹์—์„œ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์„ ๋œปํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋ณ€ํ•˜๋Š” ๊ฐ’ ๋ณ€์ˆ˜์™€ ๋ฐ˜๋Œ€์ด๋‹ค์œ„ํ‚ค๋ฐฑ๊ณผ  [๋ณธ๋ฌธ์œผ๋กœ]
  3. ํ• ๋‹น ์—ฐ์‚ฐ์ž, ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž, ๋ฌธ์ž์—ด ์—ฐ์‚ฐ์ž, ๋น„๊ต ์—ฐ์‚ฐ์ž ๋“ฑ ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ๋‹ค. ์ž˜ ๋ชจ๋ฅธ๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ๋Š” ์šฐ์„  + - * / ๋“ฑ์˜ ์‚ฐ์ˆ  ์—ฐ์‚ฐ์ž๋กœ ์ƒ๊ฐํ•˜์ž. [๋ณธ๋ฌธ์œผ๋กœ]