# Python 코딩 가이드라인 ## PEP8 모든 Python 기여는 [PEP8](https://peps.python.org/pep-0008/) 스타일 가이드를 준수하도록 요청합니다. 모든 파일은 [ruff](https://github.com/astral-sh/ruff) 자동 포맷터를 사용하여 포맷해야 합니다. `pre-commit` 이 구성되어 있다면 이것이 실행될 것입니다. - 프로젝트 저장소에는 `.editorconfig` 파일이 포함되어 있습니다. 들여쓰기 및 공백 문제를 피하기 위해 [EditorConfig](https://editorconfig.org/)를 지원하는 텍스트 편집기를 사용하는 것을 권장합니다. Python과 HTML 파일은 들여쓰기에 4칸 공백을 사용합니다. Wagtail의 테스트 종속성(`pip install -e '.[testing]'`)을 설치했다면, `make lint` 를 실행하여 코드를 확인할 수 있습니다. `make lint-server` 를 실행하여 Python 관련 린팅만 확인할 수도 있습니다. `make format` 으로 모든 Python 포맷팅을 실행할 수 있습니다. 린팅과 유사하게, `make format-server` 를 실행하여 Python/템플릿 전용 파일을 포맷할 수 있습니다. ## Django 호환성 Wagtail은 여러 버전의 Django와 호환되도록 작성되었습니다. 때로는 최신 버전의 Django에 대해서는 한 가지 코드를, 이전 버전의 Django에 대해서는 다른 코드를 실행해야 합니다. 이러한 경우, 항상 `django.VERSION` 을 검사하여 사용 중인 Django 버전을 확인하세요: ```python from django import VERSION as DJANGO_VERSION if DJANGO_VERSION >= (1, 9): # 새 속성 사용 related_field = field.rel else: # 이전, 사용되지 않는 속성 사용 related_field = field.related ``` 항상 버전을 비교할 때는 크거나 같음(`>=`)을 사용하여 최신 버전의 Django 코드가 먼저 오도록 하세요. 객체에 최신 버전의 Django에서 도입된 속성이나 메서드가 있는지 확인할 때 `try ... except` 를 사용하지 마세요. `try ... except` 가 왜 사용되었는지 명확하게 표현하지 못하기 때문입니다. Django 버전에 대한 명시적인 확인은 코드의 의도를 매우 명확하게 합니다. ```python # 이렇게 하지 마세요 try: related_field = field.rel except AttributeError: related_field = field.related ``` 코드가 여러 번 Django 버전에서 변경된 것을 사용해야 하는 경우, 확인을 캡슐화하는 함수를 만드는 것을 고려하세요: ```python import django def related_field(field): if DJANGO_VERSION >= (1, 9): return field.rel else: return field.related ``` Django에서 도입된 새로운 함수가 Wagtail에 매우 유용하다고 생각되지만, Wagtail이 지원하는 이전 버전의 Django에서는 사용할 수 없는 경우, 해당 함수를 Wagtail로 복사해 올 수 있습니다. 사용자가 함수가 있는 새 버전의 Django를 실행하는 경우, 해당 함수는 Django에서 가져와야 합니다. 그렇지 않으면 Wagtail에 번들된 버전을 사용해야 합니다. 이 함수가 가져온 Django 소스 코드에 대한 링크를 포함해야 합니다: ```python import django if DJANGO_VERSION >= (1, 9): from django.core.validators import validate_unicode_slug else: # https://github.com/django/django/blob/1.9/django/core/validators.py#L230 에서 가져옴 def validate_unicode_slug(value): # 코드는 독자의 연습 문제로 남겨둠 pass ``` ## 테스트 Wagtail에는 테스트 스위트가 있으며, 저희는 이를 개선하고 확장하는 데 전념하고 있습니다. [](testing)을 참조하세요. 커밋이나 풀 리퀘스트가 테스트 실패를 유발하지 않도록 지속적인 통합을 실행합니다. 여러분의 기여가 Wagtail에 기능을 추가하는 경우, 이를 커버하는 추가 테스트를 포함해주세요. 여러분의 기여가 기존 기능을 변경하는 경우, 관련 테스트를 그에 맞게 업데이트해주세요.