- 참고: 구글 스타일
- 문장인 경우: 마침표를 붙입니다.
- 문장이 아닌 경우: 마침표를 붙이지 않습니다.
- 4-Space를 들여쓰기의 기본 단위로 사용합니다.
2.1 변수 명명법
snake_case
로 변수를 정의합니다.
snake_case_variable = '8percent'
- 모델 클래스를 변수로 정의하는 경우에는 대문자로 시작하는 이름을 허용합니다.
User = get_user_model()
ContentType = apps.get_model('contenttypes', 'ContentType')
2.2 클래스 명명법
PascalCase
로 클래스의 이름을 정의합니다.
class SampleModel(models.Model):
...
2.3 메서드 명명법
snake_case
로 메서드의 이름을 정의합니다.
def snake_case_name():
...
- 내부적으로 사용되는 메서드임을 표시하고 싶은경우
_
(언더스코어) 를 메서드명 앞에 붙입니다.
def _internal_use_only():
...
2.4 모델 명명법
- 모델의 이름은 전체 App에서 유일하면 좋습니다. 하지만 의미를 명확하게 하는 것이 더 좋습니다. 중복된 이름도 가능합니다.
# 중복 허용
eight.models.EightModel
nine.models.EightModel
# import 할 때, alias를 적극 활용합니다.
from nine.model import EightModel as NineEightModel
4.1 한 줄에 하나의 모듈 혹은 메서드를 Import 합니다.
# Good
import os
import sys
# Bad
import os, sys
- 각 그룹 사이에는 빈 줄을 추가합니다.
- 그룹 위계: Python 표준 library > 3rd party library > application library
- 참고: Imports
4.2 python 표준 라이브러리, 3rd party 라이브러리, 애플리케이션 라이브러리 순으로 Import 합니다.
import os
import sys
from django.conf import settings
from apps.users.models import User
- 클래스를 정의할 때 object의 상속을 명시하지 않습니다.
- Python3 부터 가능합니다.
# Good
class EightClass:
# Bad
class EightClass(object)
7.1 메서드, 인스턴스 변수 명명법 참고: 메서드 이름과 인스턴스 변수
- 소문자를 사용합니다.
- 가독성을 위해 1개의 underscore로 단어를 구분합니다.
- 서브클래스와의 이름 충돌을 피하기 위해 2개의 underscore로 시작하는 이름을 사용합니다.
- 서브클래스가 없는 경우, 2개의 underscore를 사용하지 않습니다.
7.2 메서드와 프로퍼티
- 내부에서 변경(write) 작업이 없으면서 parameter가 없는 조회(read) 함수에 대해서는 다음 기준을 따릅니다.
7.2.1 메서드
- 내부에서 aggregation이 있을 때, get_oo처럼 작성해서 계산됨을 명시합니다.
7.2.2 프로퍼티
- 메서드에 해당하지 않는 경우, 프로퍼티로 구현합니다.
7.2.3 cached_property
- 프로퍼티 중 캐시되어도 문제가 없는 경우
- 이름 뒤에 "_cached"를 추가합니다.
9.1 내부 클래스의 순서는 다음과 같은 순서로 정의합니다.
Fields
Manager
class Meta
def __str__()
def save()
def get_absolute_url()
Custom Methods
9.2 필드
9.3 모델 매니저
9.4 Meta
class Meta
의verbose_name
은 최대한 유니크한 이름을 갖도록 합니다.
Admin에서 효과적으로 분류하기 위한 목적입니다.
9.5 save()
9.6 인스턴스 메서드와 프로퍼티
- 로직 내부에서 변경 작업이 없으면서, 매개변수가 없는 조회함수에 대해 다음 기준을 따른다.
# method 사용
# get_foo 형태로 작성해서 로직내에서 계산이 진행됨을 명확하게 알린다.
def get_sum(self):
return self.scores.aggregate(...)
# property 사용
@property
def is_male(self):
return self.gender == 'M'
# cached_property 사용
# property 중에 cache가 되어도 문제가 없는 경우에 사용한다.
@cached_property
def some_calculation(self):
return calculated_value