![]()
참고자료
1️⃣ 파이썬 스타일 가이드
파이썬은 PEP 8이라고 해서 파이썬 코드를 작성할 때의 스타일 가이드를 제시한다.
나는 그 내용 중 Naming Conventions에 대해 요약하고자 한다.
| 항목 | 규칙 및 예시 |
|---|---|
| 변수 | 소문자와 밑줄 사용 (예: variable_name) |
| 함수 | 소문자와 밑줄 사용 (예: function_name) |
| 클래스 | 각 단어의 첫 글자를 대문자로 (예: ClassName) |
| 모듈 | 짧고 소문자, 필요 시 밑줄 사용 (예: module_name) |
| 패키지 | 짧고 소문자, 필요 시 밑줄 사용 (예: module_name) |
- 소문자와 밑줄을 혼합해서 사용하는 것을
snake_case라고 한다. → 변수, 함수, 모듈, 패키지 - 단어의 첫 글자를 대문자로 표현하는 것을
CamelCase라고 한다. → 클래스
2️⃣ 나만의 패키지 만들기
# 파일 구조 예시
메인패키지/
│ ├── __init__.py
│ ├── 메인모듈1.py : myClass1, myfunc1, myfunc2
│ ├── 메인모듈2.py : myClass2, myfunc3, myfunc4
test.py
나는 모듈들의 클래스, 함수를 불러오는 방법이 너무 헷갈렸다. .의 유무가 때에 따라 달라졌기 때문이다.
결론을 먼저 말하자면 다음과 같이 요약할 수 있다.
결론 요약
⭐️ 직접 실행하는 파일에서는 절대경로, 아니라면 상대경로 ⭐️
1) 절대경로를 써야 하는 경우
결론을 잘 이해하기 위해서는 main.py에서 우리가 if __name__="__main__"를 왜 쓰는지를 알아야 한다.
일단 우리가 만드는 파이썬 파일은 모두 모듈이라고 생각하자. 이때 __name__는 모듈 이름을 의미한다.
그런데 파이썬 파일을 직접 실행하게 되면 이 이름이 __main__으로 바뀌어 버린다.
그래서 우리가 테스트 코드를 실행할 때 if __name__="__main__"를 사용하는 것이다. 이 조건문 아래의 코드는 모듈 안의 클래스, 함수에 영향을 주지 않기 때문이다.
위의 파일 구조 예시를 통해 알아보면 나는 test.py에 메인패키지의 메인모듈1의 myClass1 클래스를 가져오려고 한다. 그리고 test.py를 직접 실행시킬 것이다.
먼저 상대경로로 불러와보자.
# test.py
from .메인패키지.메인모듈1 import myClass1 직접 실행하는데 내 함수를 상대경로로 불러오는 경우
🚨
ImportError: attempted relative import with no known parent package
그럼 다음과 같은 에러를 얻게 된다. __name__이 test가 아닌 __main__이 되어 상대경로의 기준을 모르겠다는 의미인 것이다.
그래서 우리는 이럴 때에는 절대경로를 사용해야 한다.
# test.py
from 메인패키지.메인모듈1 import myClass1 2) 상대경로를 써야 하는 경우
그렇다면 실행하지 않는 모듈에서 다른 모듈의 함수를 불러올 때에는 어떻게 해야할까?
예를 들어 나는 메인모듈1에서 메인모듈2에 있는 myfunc4를 불러오려고 한다.
먼저 절대경로로 불러와보자.
# 메인모듈1.py
from 메인모듈2 import myfunc4직접 실행하지 않을 때 내 함수를 절대경로로 불러오는 경우
🚨
ModuleNotFoundError: No module named '메인모듈2'
나는 이 부분이 가장 헷갈렸다. 그러나 우리가 실행이 어디에서 시작되었는지 를 잘 생각하면 궁금증이 바로 풀린다.
나는 메인모듈1.py에서 메인모듈2를 절대경로로 불러왔다. 그러나 내가 결국 실행시킨 것은 test.py이다.
따라서 기준 경로는 test.py가 있는 폴더이기 때문에 이 안에는 메인모듈2을 찾을 수 없어서 에러가 나게 되는 것이다.
3) __init__.py 활용
__init__.py은 해당 폴더가 패키지임을 알려주는 파일로, 패키지를 import하게 되면 자동으로 실행된다.
우리가 클래스를 만들 때 def __init__(self):를 설정하는 것과 같은 것이다.
이 파일은 패키지 안의 모듈들을 미리 import하는 데 매우 편리하다.
메인패키지 안의 메인모듈1과 메인모듈2의 내용을 불러오기 위해서는 다음과 같이 쓸 수 있다.
# test.py
from 메인패키지 import 메인모듈1
from 메인패키지 import 메인모듈2메인모듈1과 메인모듈2의 기능이 각기 다르다면 위의 코드처럼 쓰면 각 클래스와 함수의 내용이 더 잘 이해가 되겠지만, 동일한 기능이거나 파일 구분의 의미가 없다면 이러한 파일들이 많아질수록 비효율적으로 코드가 길어지게 된다. 이럴 때 __init__.py를 활용하면 쉽게 클래스 및 함수들을 한번에 불러올 수 있다.
# 메인패키지/__init__.py
from .메인모듈1 import *
from .메인모듈2 import *이렇게 작성하게 되면 나중에 다음과 같이 간단하게 import가 가능해진다.
from 메인패키지 import myClass1, myClass2줄이 될 수 있었던 모듈을 불러오늘 줄을 1줄로 관리할 수 있는 것이다.