μ€λμ νμ΄μ¬ ν΄λ¦° μ½λ μμ±μ λν μ€κ³ κΈμ λ²μ μ νμ μκ°ν΄λ릴κ²μ. μ΄κΈμ νλ³΄λ€ λ μ¬νλ λ΄μ©μ λ€λ£¨λ©°, μ¬λ¬λΆμ μ½λ νμ§μ ν λ¨κ³ μ κ·Έλ μ΄λν μ μλ λ°©λ²λ€μ μμλ³΄κ² μ΅λλ€. π
1. ν¨μ μκ·Έλμ² κ°μ νκΈ°
ν¨μμ 맀κ°λ³μμ λ°ν νμ μ λͺ μνλ©΄ μ½λμ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ΄ ν¬κ² ν₯μλ©λλ€. μ΄λ₯Ό μν΄ νμ ννΈλ₯Ό μ¬μ©ν΄λ³΄μΈμ.
# λμ μ
def calculate_area(length, width):
return length * width
# μ’μ μ
def calculate_area(length: float, width: float) -> float:
return length * width
2. 컨ν μ€νΈ 맀λμ μ¬μ©νκΈ°
리μμ€λ₯Ό κ΄λ¦¬ν λ 컨ν μ€νΈ 맀λμ λ₯Ό μ¬μ©νλ©΄ λ μμ νκ³ κ°κ²°ν μ½λλ₯Ό μμ±ν μ μμ΄μ. μλ₯Ό λ€μ΄ νμΌ μ μΆλ ₯μ΄λ λ°μ΄ν°λ² μ΄μ€ μ°κ²°μμ μ μ©ν©λλ€.
# λμ μ
file = open('example.txt', 'r')
data = file.read()
file.close()
# μ’μ μ
with open('example.txt', 'r') as file:
data = file.read()
3. λͺ¨λνμ ν¨ν€μ§ν
μ½λλ₯Ό λͺ¨λννκ³ ν¨ν€μ§ννλ©΄ μ¬μ¬μ©μ±κ³Ό μ μ§λ³΄μμ±μ΄ λμμ§λλ€. κΈ°λ₯λ³λ‘ λͺ¨λμ λΆλ¦¬νκ³ , κ΄λ ¨ λͺ¨λλ€μ ν¨ν€μ§λ‘ λ¬Άμ΄λ³΄μΈμ.
# λͺ¨λν μ
def fetch_data():
pass
def process_data():
pass
# λͺ¨λν ν
# data_fetcher.py
def fetch_data():
pass
# data_processor.py
def process_data():
pass
4. μΆμνμ μΈν°νμ΄μ€
μΆμνλ₯Ό ν΅ν΄ μ½λμ 볡μ‘μ±μ μ€μ΄κ³ , μΈν°νμ΄μ€λ₯Ό μ¬μ©ν΄ ꡬν체λ₯Ό κ΅μ²΄νκΈ° μ½κ² λ§λ€ μ μμ΄μ.
# λμ μ
class FileStorage:
def store(self, data):
# νμΌ μ μ₯ μ½λ
class DataProcessor:
def __init__(self, storage: FileStorage):
self.storage = storage
# μ’μ μ
from abc import ABC, abstractmethod
class Storage(ABC):
@abstractmethod
def store(self, data):
pass
class FileStorage(Storage):
def store(self, data):
# νμΌ μ μ₯ μ½λ
class DataProcessor:
def __init__(self, storage: Storage):
self.storage = storage
5. λΆλ³ κ°μ²΄ μ¬μ©νκΈ°
λΆλ³ κ°μ²΄λ₯Ό μ¬μ©νλ©΄ μν λ³κ²½μΌλ‘ μΈν λ²κ·Έλ₯Ό μ€μΌ μ μμ΄μ. νμ΄μ¬μμλ namedtupleμ΄λ dataclass(frozen=True)λ₯Ό μ¬μ©ν΄ λΆλ³ κ°μ²΄λ₯Ό λ§λ€ μ μμ΅λλ€.
# λμ μ
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
point = Point(1, 2)
point.x = 3 # μν λ³κ²½ κ°λ₯
# μ’μ μ
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
point = Point(1, 2)
# point.x = 3 # μν λ³κ²½ λΆκ°λ₯
6. λλ²κΉ κ³Ό λ‘κΉ
ν¨μ¨μ μΈ λλ²κΉ κ³Ό λ‘κΉ μ μ½λμ μμ μ±μ λμ¬μ€λλ€. logging λͺ¨λμ μ¬μ©ν΄ λ‘κΉ μ μ€μ νκ³ , λλ²κΉ μμλ pdbλ₯Ό νμ©ν΄λ³΄μΈμ.
import logging
logging.basicConfig(level=logging.INFO)
def divide(a, b):
logging.info(f"Dividing {a} by {b}")
if b == 0:
logging.error("Division by zero!")
return None
return a / b
result = divide(10, 2)
7. ν μ€νΈ 컀λ²λ¦¬μ§ λμ΄κΈ°
ν μ€νΈ 컀λ²λ¦¬μ§λ₯Ό λμ¬ μ½λμ μμ μ±μ 보μ₯νμΈμ. λ¨μ ν μ€νΈ, ν΅ν© ν μ€νΈλ₯Ό μμ±νκ³ , pytestμ κ°μ λꡬλ₯Ό μ¬μ©ν΄ ν μ€νΈ 컀λ²λ¦¬μ§λ₯Ό μΈ‘μ ν΄λ³΄μΈμ.
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
assert add(-1, 1) == 0
if __name__ == "__main__":
test_add()
print("All tests passed!")
8. μ½λ 리ν©ν λ§
μ κΈ°μ μΌλ‘ μ½λλ₯Ό 리ν©ν λ§ν΄ κ°λ μ±κ³Ό μ μ§λ³΄μμ±μ λμ΄μΈμ. λΆνμν μ€λ³΅μ μ κ±°νκ³ , μ½λλ₯Ό λ κ°κ²°νκ² λ§λλ κ²μ΄ μ€μν΄μ.
# 리ν©ν λ§ μ
def get_user_name(user):
return user['name']
def get_user_email(user):
return user['email']
# 리ν©ν λ§ ν
def get_user_attribute(user, attribute):
return user.get(attribute)
μ΄λ¬ν μ€κ³ κΈμ νλ€μ νμ©νλ©΄ νμ΄μ¬ μ½λμ νμ§μ΄ νμΈ΅ λ ν₯μλ κ±°μμ. ν΄λ¦° μ½λλ₯Ό μμ±νλ μ΅κ΄μ λ€μ΄λ©΄, μ½λ μ μ§λ³΄μμ νμ μ΄ ν¨μ¬ λ μμν΄μ§ κ²λλ€. π