All Articles

Python - module로 코드 중복 줄이기

Refactoring이란

함수 기능은 그대로 두고 구현하는 방식을 개선하는 것. 함수를 별도 파일로 저장해 모듈화 하고 import 하면 코드 중복을 줄여 효율적으로 작성 가능하다.

  • 예시
    refactoring 전 index.py 파일
#!/usr/local/bin/python3
print("content-type:text/html; charset=utf-8\n")
print()
import cgi, os

def getList():
  files = os.listdir('data')
  listStr = ''
  for item in files:
    listStr = listStr + '<li><a href="index.py?id={name}">{name}</a></li>'.format(name=item)
  return listStr

form = cgi.FieldStorage()
if 'id' in form:
  pageId = form['id'].value
  description = open('data/'+pageId, 'r').read()
  update_link = '<a href="update.py?id={}">update</a>'.format(pageId)
  delete_action = '''
    <form action="process_delete.py" method="post">
      <input type="hidden" name="pageId" value="{}">
      <input type="submit" value="delete">
    </form>
  '''.format(pageId)
else:
  pageId = 'Welcome'
  description = 'Hello, Web'
  update_link = ''
  delete_action = ''
print('''
<!doctype html>
<html>
<head>
  <title></title>
  <meta charset="utf-8">
</head>
<body>
  <h1><a href="index.py" target="_blank">WEB</a>
</h1>
  <ol>
    {listStr}
  </ol>
  <a href="create.py">create</a>
  {update_link}
  {delete_action}
<h2>{title}</h2>
<p>{desc}</p>
</body>
</html>
'''.format(
    title=pageId,
    desc = description,
    listStr=getList(),
    update_link=update_link,
    delete_action=delete_action))

getList()함수 부분을 view.py 라는 별도 파일로 분리

def getList():
  files = os.listdir('data')
  listStr = ''
  for item in files:
    listStr = listStr + '<li><a href="index.py?id={name}">{name}</a></li>'.format(name=item)
  return listStr

refactoring 후 index.py 파일 import 모듈명으로 불러오고 모듈명.함수명으로 사용

#!/usr/local/bin/python3
print("content-type:text/html; charset=utf-8\n")
print()
import cgi, os, view

form = cgi.FieldStorage()
if 'id' in form:
  pageId = form['id'].value
  description = open('data/'+pageId, 'r').read()
  update_link = '<a href="update.py?id={}">update</a>'.format(pageId)
  delete_action = '''
    <form action="process_delete.py" method="post">
      <input type="hidden" name="pageId" value="{}">
      <input type="submit" value="delete">
    </form>
  '''.format(pageId)
else:
  pageId = 'Welcome'
  description = 'Hello, Web'
  update_link = ''
  delete_action = ''
print('''
<!doctype html>
<html>
<head>
  <title></title>
  <meta charset="utf-8">
</head>
<body>
  <h1><a href="index.py" target="_blank">WEB</a>
</h1>
  <ol>
    {listStr}
  </ol>
  <a href="create.py">create</a>
  {update_link}
  {delete_action}
<h2>{title}</h2>
<p>{desc}</p>
</body>
</html>
'''.format(
    title=pageId,
    desc = description,
    listStr=view.getList(),
    update_link=update_link,
    delete_action=delete_action))