KR_Module - somaz94/python-study GitHub Wiki

Python λͺ¨λ“ˆ(Module) κ°œλ… 정리


1️⃣ λͺ¨λ“ˆ(Module)μ΄λž€?

λͺ¨λ“ˆμ€ 파이썬 μ½”λ“œλ₯Ό λ…Όλ¦¬μ μœΌλ‘œ 묢어놓은 λ‹¨μœ„λ‘œ, μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό 파일 λ‹¨μœ„λ‘œ 관리할 수 있게 ν•΄μ€€λ‹€.

# mymath.py
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

PI = 3.14159

βœ… λͺ¨λ“ˆμ˜ μ£Όμš” νŠΉμ§•:

  • μ½”λ“œ μž¬μ‚¬μš©μ„±: ν•œλ²ˆ μž‘μ„±ν•œ μ½”λ“œλ₯Ό μ—¬λŸ¬ ν”„λ‘œκ·Έλž¨μ—μ„œ ν™œμš©
  • λ„€μž„μŠ€νŽ˜μ΄μŠ€ 관리: 이름 좩돌 λ°©μ§€ 및 μ½”λ“œ ꡬ쑰화
  • κΈ°λŠ₯ 뢄리: κ΄€λ ¨ κΈ°λŠ₯을 λ…Όλ¦¬μ μœΌλ‘œ κ·Έλ£Ήν™”
  • μœ μ§€λ³΄μˆ˜ 용이: κ΄€λ ¨ μ½”λ“œλ₯Ό λ…λ¦½μ μœΌλ‘œ 관리


2️⃣ λͺ¨λ“ˆ μž„ν¬νŠΈ

# 전체 λͺ¨λ“ˆ μž„ν¬νŠΈ
import mymath

# νŠΉμ • ν•¨μˆ˜/λ³€μˆ˜λ§Œ μž„ν¬νŠΈ
from mymath import add, PI

# λͺ¨λ“  μš”μ†Œ μž„ν¬νŠΈ (ꢌμž₯ν•˜μ§€ μ•ŠμŒ)
from mymath import *

# 별칭 μ‚¬μš©
import mymath as mm

βœ… μž„ν¬νŠΈ 방식별 νŠΉμ§•:

  • import λͺ¨λ“ˆλͺ…: λͺ¨λ“ˆ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μœ μ§€ν•˜λ©° μ ‘κ·Ό (예: λͺ¨λ“ˆλͺ….ν•¨μˆ˜())
  • from λͺ¨λ“ˆ import 이름: νŠΉμ • μ΄λ¦„λ§Œ ν˜„μž¬ λ„€μž„μŠ€νŽ˜μ΄μŠ€λ‘œ κ°€μ Έμ˜΄
  • import λͺ¨λ“ˆ as 별칭: λͺ¨λ“ˆλͺ…을 더 μ§§κ±°λ‚˜ λͺ…ν™•ν•œ μ΄λ¦„μœΌλ‘œ μ‚¬μš©
  • from λͺ¨λ“ˆ import *: λͺ¨λ“  곡개 이름을 κ°€μ Έμ˜€μ§€λ§Œ λ„€μž„μŠ€νŽ˜μ΄μŠ€ μ˜€μ—Ό μœ„ν—˜


3️⃣ if name == "main"

# test_module.py
def main_function():
    print("메인 κΈ°λŠ₯ μ‹€ν–‰")

if __name__ == "__main__":
    # 이 파일이 직접 싀행될 λ•Œλ§Œ 싀행됨
    main_function()

βœ… μ£Όμš” μš©λ„:

  • λͺ¨λ“ˆ ν…ŒμŠ€νŠΈ: λͺ¨λ“ˆ 자체 μ‹€ν–‰ μ‹œ ν…ŒμŠ€νŠΈ μ½”λ“œ μ‹€ν–‰
  • 라이브러리/μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 이쀑 μš©λ„: 같은 μ½”λ“œλ₯Ό λΌμ΄λΈŒλŸ¬λ¦¬μ™€ 슀크립트둜 ν™œμš©
  • 슀크립트 μ§„μž…μ : λͺ¨λ“ˆ 직접 μ‹€ν–‰ μ‹œ μ‹œμž‘μ  μ§€μ •
  • λͺ¨λ“ˆ μž„ν¬νŠΈ μ‹œ λΆˆν•„μš”ν•œ μ½”λ“œ μ‹€ν–‰ λ°©μ§€


4️⃣ νŒ¨ν‚€μ§€(Package)

mypackage/
    __init__.py
    module1.py
    module2.py
    subpackage/
        __init__.py
        module3.py

βœ… νŒ¨ν‚€μ§€ νŠΉμ§•:

  • λͺ¨λ“ˆμ˜ 계측적 ꡬ쑰화: κ΄€λ ¨ λͺ¨λ“ˆμ„ λ””λ ‰ν† λ¦¬λ‘œ ꡬ쑰화
  • __init__.py: 디렉토리λ₯Ό νŒ¨ν‚€μ§€λ‘œ μΈμ‹ν•˜κ²Œ ν•˜λŠ” 파일 (Python 3.3+ μ—μ„œλŠ” 선택사항)
  • ν•˜μœ„ νŒ¨ν‚€μ§€: λ¬΄μ œν•œ 쀑첩 κ°€λŠ₯ν•œ 계측 ꡬ쑰
  • λ„€μž„μŠ€νŽ˜μ΄μŠ€ νŒ¨ν‚€μ§€: Python 3.3+ μ—μ„œλŠ” __init__.py 없이도 κ°€λŠ₯


5️⃣ λͺ¨λ“ˆ 검색 경둜

import sys

# ν˜„μž¬ λͺ¨λ“ˆ 검색 경둜 확인
print(sys.path)

# 검색 경둜 μΆ”κ°€
sys.path.append('/path/to/my/modules')

βœ… 검색 경둜 μš°μ„ μˆœμœ„:

  1. ν˜„μž¬ μ‹€ν–‰ 쀑인 슀크립트의 디렉토리
  2. PYTHONPATH ν™˜κ²½ λ³€μˆ˜μ— μ§€μ •λœ 디렉토리
  3. Python μ„€μΉ˜ μ‹œ κΈ°λ³Έ 라이브러리 경둜
  4. μ‚¬μ΄νŠΈ νŒ¨ν‚€μ§€ (pip λ“±μœΌλ‘œ μ„€μΉ˜ν•œ νŒ¨ν‚€μ§€)
  5. .pth νŒŒμΌμ— μ§€μ •λœ 경둜


6️⃣ λͺ¨λ“ˆ μž¬λ‘œλ”©

import importlib

# λͺ¨λ“ˆ μž¬λ‘œλ”©
importlib.reload(my_module)

βœ… μž¬λ‘œλ”© μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€:

  • 개발 쀑 λͺ¨λ“ˆ μˆ˜μ • μ‹œ 변경사항 적용
  • μž₯μ‹œκ°„ μ‹€ν–‰ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ λͺ¨λ“ˆ 동적 μ—…λ°μ΄νŠΈ
  • λͺ¨λ“ˆ μƒνƒœ μ΄ˆκΈ°ν™”
  • 디버깅 및 ν…ŒμŠ€νŠΈ


7️⃣ λ‚΄μž₯ λͺ¨λ“ˆ

νŒŒμ΄μ¬μ€ λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” ν‘œμ€€ 라이브러리 λͺ¨λ“ˆμ„ ν¬ν•¨ν•œλ‹€.

# 파일 μ‹œμŠ€ν…œ μž‘μ—…
import os
print(os.getcwd())  # ν˜„μž¬ μž‘μ—… 디렉토리 좜λ ₯

# 경둜 μ‘°μž‘
import os.path
print(os.path.join('folder', 'file.txt'))  # 'folder/file.txt' (Unix) λ˜λŠ” 'folder\\file.txt' (Windows)

# μ •κ·œ ν‘œν˜„μ‹
import re
result = re.search(r'\d+', 'abc123def')
print(result.group())  # '123'

# μ‹œκ°„ κ΄€λ ¨ κΈ°λŠ₯
import time
print(time.time())  # μœ λ‹‰μŠ€ νƒ€μž„μŠ€νƒ¬ν”„ 좜λ ₯

# λ‚ μ§œ 및 μ‹œκ°„ 처리
import datetime
now = datetime.datetime.now()
print(now.strftime("%Y-%m-%d"))  # 였늘 λ‚ μ§œ 좜λ ₯

# JSON 처리
import json
data = json.dumps({'name': 'John', 'age': 30})
print(data)  # '{"name": "John", "age": 30}'

# λ‚œμˆ˜ 생성
import random
print(random.randint(1, 10))  # 1λΆ€ν„° 10 μ‚¬μ΄μ˜ λ‚œμˆ˜ 좜λ ₯

βœ… 자주 μ‚¬μš©λ˜λŠ” λ‚΄μž₯ λͺ¨λ“ˆ:

  • os, sys: 운영체제 μΈν„°νŽ˜μ΄μŠ€, μ‹œμŠ€ν…œ κ΄€λ ¨ κΈ°λŠ₯
  • datetime, time: λ‚ μ§œ 및 μ‹œκ°„ 처리
  • math, random: μˆ˜ν•™ ν•¨μˆ˜, λ‚œμˆ˜ 생성
  • json, csv, xml: 데이터 ν˜•μ‹ 처리
  • re: μ •κ·œ ν‘œν˜„μ‹
  • collections: 특수 μ»¨ν…Œμ΄λ„ˆ μžλ£Œν˜•
  • itertools, functools: 반볡 및 ν•¨μˆ˜ν˜• 도ꡬ
  • urllib, http: λ„€νŠΈμ›Œν¬ 및 μ›Ή κ΄€λ ¨ κΈ°λŠ₯


8️⃣ λͺ¨λ“ˆκ³Ό λ„€μž„μŠ€νŽ˜μ΄μŠ€

# module_a.py
var = "λͺ¨λ“ˆ A의 λ³€μˆ˜"

# module_b.py
var = "λͺ¨λ“ˆ B의 λ³€μˆ˜"

# main.py
import module_a
import module_b

print(module_a.var)  # "λͺ¨λ“ˆ A의 λ³€μˆ˜"
print(module_b.var)  # "λͺ¨λ“ˆ B의 λ³€μˆ˜"

var = "λ©”μΈμ˜ λ³€μˆ˜"
print(var)  # "λ©”μΈμ˜ λ³€μˆ˜"

βœ… λ„€μž„μŠ€νŽ˜μ΄μŠ€ 관리:

  • λͺ¨λ“ˆ λ„€μž„μŠ€νŽ˜μ΄μŠ€: 각 λͺ¨λ“ˆμ€ 독립적인 이름 곡간 제곡
  • 이름 좩돌 λ°©μ§€: λ™μΌν•œ μ΄λ¦„μ˜ 객체도 λͺ¨λ“ˆλ³„λ‘œ ꡬ뢄
  • 심볼 κ°€μ‹œμ„±: _둜 μ‹œμž‘ν•˜λŠ” 이름은 λΉ„κ³΅κ°œ μ‹¬λ³Όλ‘œ κ°„μ£Ό
  • κΈ€λ‘œλ²Œ λ„€μž„μŠ€νŽ˜μ΄μŠ€: 메인 ν”„λ‘œκ·Έλž¨μ˜ μ΅œμƒμœ„ 이름 곡간


9️⃣ λͺ¨λ“ˆ 속성

λͺ¨λ“ˆλ„ κ°μ²΄λ‘œμ„œ λ‹€μ–‘ν•œ 속성을 κ°€μ§„λ‹€.

# module_info.py
"""
이 λͺ¨λ“ˆμ€ λͺ¨λ“ˆ 속성을 μ„€λͺ…ν•˜κΈ° μœ„ν•œ 예제 λͺ¨λ“ˆμž…λ‹ˆλ‹€.
"""

def example_function():
    return "ν•¨μˆ˜ μ‹€ν–‰ κ²°κ³Ό"

class ExampleClass:
    pass

CONSTANT = 42

# λ‹€λ₯Έ νŒŒμΌμ—μ„œ:
import module_info

# λͺ¨λ“ˆ λ¬Έμ„œμ—΄(docstring) μ ‘κ·Ό
print(module_info.__doc__)

# λͺ¨λ“ˆ 파일 경둜
print(module_info.__file__)

# λͺ¨λ“ˆ 이름
print(module_info.__name__)

# λͺ¨λ“ˆ λ‚΄ μ •μ˜λœ 이름 λͺ©λ‘
print(dir(module_info))

# λͺ¨λ“ˆμ˜ νŠΉμ • 속성 확인
print(hasattr(module_info, 'example_function'))

βœ… μ£Όμš” λͺ¨λ“ˆ 속성:

  • __doc__: λͺ¨λ“ˆ λ¬Έμ„œμ—΄(docstring)
  • __file__: λͺ¨λ“ˆ 파일의 경둜
  • __name__: λͺ¨λ“ˆμ˜ 이름 (직접 μ‹€ν–‰ μ‹œ "main")
  • __package__: λͺ¨λ“ˆμ΄ μ†ν•œ νŒ¨ν‚€μ§€ 이름
  • __dict__: λͺ¨λ“ˆμ˜ 심볼 ν…Œμ΄λΈ” (λ„€μž„μŠ€νŽ˜μ΄μŠ€)
  • __loader__: λͺ¨λ“ˆμ„ λ‘œλ“œν•œ λ‘œλ” 객체
  • __spec__: λͺ¨λ“ˆμ˜ λͺ…μ„Έ 정보


πŸ”Ÿ λͺ¨λ“ˆ λ””μžμΈ νŒ¨ν„΄

1. νŒ©ν† λ¦¬ νŒ¨ν„΄

# factory_module.py
def create_adder(increment):
    def add(x):
        return x + increment
    return add

def create_multiplier(factor):
    def multiply(x):
        return x * factor
    return multiply

# μ‚¬μš© 예:
from factory_module import create_adder, create_multiplier

add_five = create_adder(5)
double = create_multiplier(2)

print(add_five(10))     # 15
print(double(10))       # 20

2. 싱글톀 νŒ¨ν„΄

# singleton_module.py
class Singleton:
    _instance = None
    
    @classmethod
    def get_instance(cls):
        if cls._instance is None:
            cls._instance = cls()
        return cls._instance
    
    def __init__(self):
        if self.__class__._instance is not None:
            raise RuntimeError("이 ν΄λž˜μŠ€λŠ” μ‹±κΈ€ν†€μž…λ‹ˆλ‹€!")
        self.value = 0

# μ‚¬μš© 예:
from singleton_module import Singleton

instance1 = Singleton.get_instance()
instance2 = Singleton.get_instance()

print(instance1 is instance2)  # True

3. ν”ŒλŸ¬κ·ΈμΈ νŒ¨ν„΄

# plugin_manager.py
class PluginManager:
    def __init__(self):
        self.plugins = {}
    
    def register_plugin(self, name, plugin):
        self.plugins[name] = plugin
    
    def get_plugin(self, name):
        return self.plugins.get(name)

# plugin1.py
def process(data):
    return f"ν”ŒλŸ¬κ·ΈμΈ 1: {data.upper()}"

# plugin2.py
def process(data):
    return f"ν”ŒλŸ¬κ·ΈμΈ 2: {data.lower()}"

# main.py
from plugin_manager import PluginManager
import plugin1
import plugin2

manager = PluginManager()
manager.register_plugin("upper", plugin1.process)
manager.register_plugin("lower", plugin2.process)

text = "Hello World"
print(manager.get_plugin("upper")(text))  # ν”ŒλŸ¬κ·ΈμΈ 1: HELLO WORLD
print(manager.get_plugin("lower")(text))  # ν”ŒλŸ¬κ·ΈμΈ 2: hello world

βœ… λͺ¨λ“ˆ λ””μžμΈ νŒ¨ν„΄ ν™œμš©:

  • νŒ©ν† λ¦¬ νŒ¨ν„΄: 객체 생성 둜직 μΊ‘μŠν™”
  • 싱글톀 νŒ¨ν„΄: μ „μ—­ μƒνƒœ 관리 및 λ¦¬μ†ŒμŠ€ 곡유
  • ν”ŒλŸ¬κ·ΈμΈ νŒ¨ν„΄: κΈ°λŠ₯ ν™•μž₯ 및 동적 λ‘œλ“œ
  • νΌμ‚¬λ“œ νŒ¨ν„΄: λ³΅μž‘ν•œ ν•˜μœ„ μ‹œμŠ€ν…œμ— λ‹¨μˆœν•œ μΈν„°νŽ˜μ΄μŠ€ 제곡
  • μ–΄λŒ‘ν„° νŒ¨ν„΄: ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ—°κ²°


1️⃣1️⃣ λͺ¨λ“ˆ 캐싱 및 μ„±λŠ₯

νŒŒμ΄μ¬μ€ λͺ¨λ“ˆμ„ 졜초 μž„ν¬νŠΈ μ‹œ μΊμ‹±ν•˜μ—¬ μ„±λŠ₯을 μ΅œμ ν™”ν•œλ‹€.

# λͺ¨λ“ˆ 캐싱 확인
import sys

# 이미 λ‘œλ“œλœ λͺ¨λ“ˆ 확인
print('math' in sys.modules)  # False (아직 λ‘œλ“œλ˜μ§€ μ•ŠμŒ)

import math
print('math' in sys.modules)  # True (이제 λ‘œλ“œλ¨)

# μΊμ‹œλœ λͺ¨λ“ˆ μ°Έμ‘°
math_cached = sys.modules['math']
print(math is math_cached)  # True (λ™μΌν•œ 객체)

# λͺ¨λ“ˆ λ‘œλ“œ μ‹œκ°„ μΈ‘μ •
import time
import importlib

# μΊμ‹œ λΉ„μš°κΈ° (μ‹€μ œλ‘œλŠ” ꢌμž₯ν•˜μ§€ μ•ŠμŒ)
if 'random' in sys.modules:
    del sys.modules['random']

# 첫 번째 λ‘œλ“œ μ‹œκ°„ μΈ‘μ •
start = time.time()
import random
first_load = time.time() - start

# 두 번째 λ‘œλ“œ μ‹œκ°„ μΈ‘μ •
if 'random' in sys.modules:
    del sys.modules['random']

start = time.time()
import random
second_load = time.time() - start

print(f"첫 번째 λ‘œλ“œ: {first_load:.6f}초")
print(f"두 번째 λ‘œλ“œ: {second_load:.6f}초")

βœ… λͺ¨λ“ˆ 캐싱 νŠΉμ§•:

  • sys.modules: 이미 λ‘œλ“œλœ λͺ¨λ“ˆμ„ μΊμ‹±ν•˜λŠ” λ”•μ…”λ„ˆλ¦¬
  • 반볡 μž„ν¬νŠΈ μ΅œμ ν™”: 동일 λͺ¨λ“ˆμ˜ 쀑볡 λ‘œλ“œ λ°©μ§€
  • λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±: λͺ¨λ“ˆ μ½”λ“œμ˜ 쀑볡 없이 μž¬μ‚¬μš©
  • λͺ¨λ“ˆ 식별: 동일 λͺ¨λ“ˆμ€ 객체 IDκ°€ κ°™μŒ
  • μˆœν™˜ μž„ν¬νŠΈ 문제 해결에 도움


1️⃣2️⃣ κ³ κΈ‰ λͺ¨λ“ˆ 기법

1. 동적 μž„ν¬νŠΈ

# λŸ°νƒ€μž„μ— λͺ¨λ“ˆ 이름 κ²°μ •
def dynamic_import(module_name):
    try:
        module = __import__(module_name)
        print(f"{module_name} λͺ¨λ“ˆμ„ μ„±κ³΅μ μœΌλ‘œ μž„ν¬νŠΈν–ˆμŠ΅λ‹ˆλ‹€.")
        return module
    except ImportError:
        print(f"{module_name} λͺ¨λ“ˆμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.")
        return None

# 예제:
math = dynamic_import('math')
if math:
    print(math.pi)

# 더 ν˜„λŒ€μ μΈ 방법 (Python 3.4+)
import importlib

def modern_dynamic_import(module_name):
    try:
        module = importlib.import_module(module_name)
        print(f"{module_name} λͺ¨λ“ˆμ„ μ„±κ³΅μ μœΌλ‘œ μž„ν¬νŠΈν–ˆμŠ΅λ‹ˆλ‹€.")
        return module
    except ImportError:
        print(f"{module_name} λͺ¨λ“ˆμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.")
        return None

2. λͺ¨λ“ˆ μžλ™ 탐색 및 λ‘œλ“œ

# plugins/ λ””λ ‰ν† λ¦¬μ˜ λͺ¨λ“  λͺ¨λ“ˆ μžλ™ λ‘œλ“œ
import os
import importlib

def load_plugins(plugin_dir='plugins'):
    plugins = {}
    
    # ν”ŒλŸ¬κ·ΈμΈ 디렉토리가 μ‘΄μž¬ν•˜λŠ”μ§€ 확인
    if not os.path.exists(plugin_dir):
        return plugins
    
    # ν”ŒλŸ¬κ·ΈμΈ λ””λ ‰ν† λ¦¬μ˜ λͺ¨λ“  Python 파일 탐색
    for filename in os.listdir(plugin_dir):
        if filename.endswith('.py') and not filename.startswith('__'):
            module_name = filename[:-3]  # .py ν™•μž₯자 제거
            
            # λͺ¨λ“ˆ λ‘œλ“œ
            module_path = f"{plugin_dir}.{module_name}"
            try:
                module = importlib.import_module(module_path)
                
                # λͺ¨λ“ˆμ΄ μ˜¬λ°”λ₯Έ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°€μ§€κ³  μžˆλŠ”μ§€ 확인
                if hasattr(module, 'run'):
                    plugins[module_name] = module
                    print(f"ν”ŒλŸ¬κ·ΈμΈ '{module_name}' λ‘œλ“œλ¨")
            except ImportError as e:
                print(f"ν”ŒλŸ¬κ·ΈμΈ '{module_name}' λ‘œλ“œ μ‹€νŒ¨: {e}")
    
    return plugins

3. λͺ¨λ“ˆ 속성 μΈνŠΈλ‘œμŠ€νŽ™μ…˜

# λͺ¨λ“ˆμ˜ λͺ¨λ“  ν•¨μˆ˜ λͺ©λ‘ 좜λ ₯
import inspect

def list_module_functions(module):
    functions = []
    for name, obj in inspect.getmembers(module, inspect.isfunction):
        # ν•΄λ‹Ή λͺ¨λ“ˆμ— 직접 μ •μ˜λœ ν•¨μˆ˜λ§Œ 필터링
        if obj.__module__ == module.__name__:
            functions.append(name)
    return functions

# 예제:
import math
print(list_module_functions(math))

# λͺ¨λ“ˆ 클래슀 검사
def list_module_classes(module):
    classes = []
    for name, obj in inspect.getmembers(module, inspect.isclass):
        if obj.__module__ == module.__name__:
            classes.append(name)
    return classes

# ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜ 검사
def get_function_info(func):
    sig = inspect.signature(func)
    return {
        'name': func.__name__,
        'doc': func.__doc__,
        'parameters': list(sig.parameters.keys()),
        'return_annotation': sig.return_annotation
    }

βœ… κ³ κΈ‰ λͺ¨λ“ˆ 기법 ν™œμš©:

  • 동적 μž„ν¬νŠΈ: λŸ°νƒ€μž„μ— ν•„μš”ν•œ λͺ¨λ“ˆ κ²°μ • 및 λ‘œλ“œ
  • λͺ¨λ“ˆ μžλ™ 발견: ν”ŒλŸ¬κ·ΈμΈ ꡬ쑰 κ΅¬ν˜„
  • μΈνŠΈλ‘œμŠ€νŽ™μ…˜: λͺ¨λ“ˆ ꡬ쑰와 λ‚΄μš© 동적 뢄석
  • λ©”νƒ€ν”„λ‘œκ·Έλž˜λ°: λͺ¨λ“ˆμ„ ν™œμš©ν•œ μ½”λ“œ 생성 및 λ³€ν˜•
  • μ§€μ—° μž„ν¬νŠΈ: μ„±λŠ₯ ν–₯상을 μœ„ν•œ ν•„μš” μ‹œμ μ— μž„ν¬νŠΈ


μ£Όμš” 팁

βœ… λͺ¨λ²” 사둀:

  • λͺ¨λ“ˆλͺ…은 μ†Œλ¬Έμžμ™€ μ–Έλ”μŠ€μ½”μ–΄ μ‚¬μš©: 가독성 높은 이름 선택
  • μˆœν™˜ μž„ν¬νŠΈ ν”Όν•˜κΈ°: λͺ¨λ“ˆ κ°„ μƒν˜Έ μ˜μ‘΄μ„± 제거
  • ν•„μš”ν•œ κ²ƒλ§Œ μž„ν¬νŠΈν•˜κΈ°: from module import * μ§€μ–‘
  • μƒλŒ€ 경둜 μž„ν¬νŠΈ 주의: λͺ…ν™•ν•œ 경둜 μ§€μ •μœΌλ‘œ ν˜Όλž€ λ°©μ§€
  • __init__.py ν™œμš©ν•˜κΈ°: νŒ¨ν‚€μ§€ μ΄ˆκΈ°ν™” 및 곡개 API μ •μ˜
  • λͺ¨λ“ˆ λ¬Έμ„œν™”: 각 λͺ¨λ“ˆμ— μ μ ˆν•œ docstring μΆ”κ°€
  • μ˜μ‘΄μ„± μ΅œμ†Œν™”: ν•„μš”ν•œ μ΅œμ†Œν•œμ˜ μ™ΈλΆ€ λͺ¨λ“ˆλ§Œ μ‚¬μš©
  • ν…ŒμŠ€νŠΈ κ°€λŠ₯ν•œ 섀계: λͺ¨λ“ˆμ΄ λ…λ¦½μ μœΌλ‘œ ν…ŒμŠ€νŠΈ κ°€λŠ₯ν•˜λ„λ‘ ꡬ성


⚠️ **GitHub.com Fallback** ⚠️