Two Scoops of Django 3.x를 읽고 정리한 글입니다
코드의 가독성이 좋고 이해하기 쉬우면 프로젝트 규모에 상관없이 유지 관리사 쉬워지며, 개선작업이 수월해진다.
코드는 쉽게 만들어야 하며, 이를 위해서는 노력이 필요하다.
⇒ 궁극적인 목적은 잊고 지내다가도 다시 보았을 때 빠르게 이해하기 위함이다.
PEP 8은 파이썬 공식 스타일 가이드다. 장고 프로젝트에서는 이 관례를 따르도록 하자. (가독성과 일관성?)
79자를 넘어서면 줄바꿈을 지원하는 텍스트 편집기 등에서 가독성을 떨어 뜨린다.
"농담이 아니라 정말로 난 여전히 화면에 80칼럼 제약이 있는 콘솔에서 작업을 한다."
베리 모리슨 (이 책의 리뷰어)
"79칼럼을 맞추려고 변수나 함수 이름 또는 클래스 이름을 줄여서 짓는 것은 허용될 수 없다. 수십년전 하드웨어 기준으로 만들어진 말도 안 되는 숫자를 지키기 보다는 읽기 쉽고 의미 있는 변수명을 만드는 것이 더욱 중요한 일이다."
# 표준 라이브러리 임포트
from math import sqrt
from os.path import abspath
# 코어 장고 임포트
from django.db import models
from django.utils.tranlation import ugettext_lazy as _
# 서드파티 앱 임포트
from django_extensions.db.models import TimeStampedModel
# 프로젝트 앱 임포트
from splits.modes import BananaSplit
코드를 작성할 때 코드들을 다른 곳으로 이동시키거나 이름을 변경하거나 버전을 나누는 등의 재구성을 손쉽게 할 수 있도록 구성하는 것은 매우 중요하다.
다음은 하드 코딩된 임포트 문을 포함하고 있다. (권장되지 않는다.)
# cones/views.py
from django.views.geneeric import CreateView
# 'cones' 패키지에 하드코딩 된 암묵적 상대 임포트가 이용되었다. (따라하지 말기)
from cones.models import WaffleCone
from cones.forms import WaffleConeForm
# 'core' 패키지에서 절대 임포트
from core.views import FoodMixin
class WaffleConeCreateView(FoodMixin, CreateView):
model = WaffleCone
form_class = WaffleConeForm
위의 예제는 이식성 또는 재사용성에서 문제가 있다.
하드코딩된 임포트 구문을 포함하고 있는 안좋은 예제를 다음과 같이 명시적 상대 임포트 예제로 바꿔보자.
# cones/views.py
from django.views.generic import CreateView
# 'cones' 패키지 명시적 상대 임포트
from .models import WaffleCone
from .forms import WaffleConeForm
# 'core' 패키지에서 절대 임포트
from core.views import FoodMixin
class WaffleConeCreateView(FoodMixin, CreateView):
model = WaffleCone
form_class = WaffleConeForm
코드 | 임포트 타입 | 용도 |
---|---|---|
from core.views import FoodMixin | 절대 임포트 | 외부에서 임포트해서 현재 앱에서 이용할 때 |
from .models import WaffleCone | 명시적 상대 | 다른 모듈에서 임포트해서 현재 앱에서 이용할 때 |
from core.views import FoodMixin | 암묵적 상대 | 명시적 상대와 같은 용도로 쓰지만 좋은 방법은 아니다 |
표1.1 임포트: 절대 vs 명시적 상대
from django import forms
from django.db import models
# 안티 패턴
from django.forms import *
from django.db.models import *
장고는 내부적으로 PEP8을 확장한 스타일 가이드라인을 가지고 있다. (link)
patterns = [
path(route='add/',
view=views.add_topping,
name='add-topping'),
]
patterns = [
path(route='add/',
view=views.add_topping,
name='topping:add_topping'),
]
실제 URL주소에서 대시를 쓰는데에는 문제가 없다. (e.g. route=’add-topping/’ )