Python
Referensi Python untuk pekerjaan software engineering, DevOps, dan AI engineering: environment, dependency, scripting, API, file/data, testing, typing, dan workflow notebook.
Runtime dan Environment
Pastikan versi Python, virtual environment, dan lokasi interpreter jelas sebelum memasang dependency.
Cek versi dan lokasi Python
python --version python -VV # versi lengkap + compiler build python -c "import sys; print(sys.executable)" python -c "import sys; print(sys.path)" which python # macOS/Linux where python # Windows PowerShell/cmd
Virtual environment bawaan
python -m venv .venv source .venv/bin/activate # macOS/Linux .venv\Scripts\activate # Windows PowerShell/cmd python -m pip install --upgrade pip deactivate
Workflow cepat dengan uv
uv sering lebih cepat untuk dependency dan environment modern, tetapi tetap simpan pyproject.toml agar project portabel.uv init uv python install 3.12 uv venv --python 3.12 uv add requests pydantic uv add --dev pytest ruff mypy uv run python main.py uv run pytest
Package dan Dependency
Install, freeze, audit, dan jalankan tool CLI Python dengan cara yang mudah direproduksi.
pip sehari-hari
python -m pip install requests python -m pip install "fastapi[standard]" python -m pip install -r requirements.txt python -m pip freeze > requirements.txt python -m pip list --outdated python -m pip uninstall requests
pyproject.toml minimal
[project] name = "my-service" version = "0.1.0" requires-python = ">=3.11" dependencies = [ "fastapi>=0.115", "pydantic>=2", ] [project.optional-dependencies] dev = ["pytest", "ruff", "mypy"]
Menjalankan CLI tool tanpa mengotori project
pipx install poetry # install CLI global terisolasi pipx run black . # jalankan sekali pakai uvx ruff check . # uv equivalent untuk tool sekali jalan python -m pip install --user pipx
Scripting dan CLI
Pola dasar untuk membuat script automation yang jelas, idempotent, dan nyaman dipanggil dari shell.
Template script aman
from pathlib import Path
def main() -> int:
root = Path.cwd()
print(f"working in {root}")
return 0
if __name__ == "__main__":
raise SystemExit(main())Argument parser
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("path")
parser.add_argument("--dry-run", action="store_true")
parser.add_argument("--limit", type=int, default=100)
args = parser.parse_args()
print(args.path, args.dry_run, args.limit)Menjalankan command eksternal
shell=True kecuali benar-benar perlu. Kirim argumen sebagai list agar escaping lebih aman.import subprocess
result = subprocess.run(
["git", "status", "--short"],
check=True,
capture_output=True,
text=True,
)
print(result.stdout)File, JSON, YAML, dan Env
Operasi I/O yang paling sering dipakai dalam automation, backend, dan pipeline data.
Path dan file text
from pathlib import Path
path = Path("logs/app.log")
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text("hello\n", encoding="utf-8")
content = path.read_text(encoding="utf-8")
for item in Path(".").glob("**/*.py"):
print(item)JSON
import json
from pathlib import Path
data = {"service": "api", "replicas": 2}
Path("config.json").write_text(json.dumps(data, indent=2), encoding="utf-8")
loaded = json.loads(Path("config.json").read_text(encoding="utf-8"))
print(loaded["service"])Environment variable
import os
database_url = os.environ["DATABASE_URL"] # wajib ada
debug = os.getenv("DEBUG", "false").lower() == "true"
timeout = int(os.getenv("TIMEOUT_SECONDS", "30"))YAML
pyyaml untuk konfigurasi sederhana.import yaml
with open("compose.yml", "r", encoding="utf-8") as f:
config = yaml.safe_load(f)
print(config["services"].keys())HTTP dan API
Client HTTP, validasi payload, dan server API minimal.
HTTP client dengan requests
import requests
response = requests.get(
"https://api.example.com/users",
headers={"Authorization": f"Bearer {token}"},
timeout=10,
)
response.raise_for_status()
data = response.json()Model data dengan Pydantic
from pydantic import BaseModel, Field
class Job(BaseModel):
name: str
retries: int = Field(default=3, ge=0, le=10)
job = Job.model_validate({"name": "sync", "retries": 2})
print(job.model_dump())FastAPI minimal
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class PredictRequest(BaseModel):
text: str
@app.post("/predict")
def predict(req: PredictRequest) -> dict[str, str]:
return {"label": "todo", "text": req.text}
# fastapi dev main.py
# uvicorn main:app --reloadAsync, Thread, dan Process
Pilih model eksekusi sesuai bottleneck: I/O, CPU, atau banyak request network.
asyncio untuk I/O concurrent
import asyncio
async def fetch_one(i: int) -> str:
await asyncio.sleep(0.1)
return f"item-{i}"
async def main() -> None:
results = await asyncio.gather(*(fetch_one(i) for i in range(10)))
print(results)
asyncio.run(main())Thread untuk blocking I/O
from concurrent.futures import ThreadPoolExecutor
def work(url: str) -> str:
return url.upper()
with ThreadPoolExecutor(max_workers=8) as pool:
for result in pool.map(work, ["a", "b", "c"]):
print(result)Process untuk CPU-bound
from concurrent.futures import ProcessPoolExecutor
def cpu_work(n: int) -> int:
return sum(i * i for i in range(n))
with ProcessPoolExecutor() as pool:
print(list(pool.map(cpu_work, [100_000, 200_000, 300_000])))Testing dan Debugging
Perintah untuk menjalankan test, debug cepat, logging, dan profiling ringan.
pytest dasar
pytest pytest -q pytest tests/test_api.py pytest -k "login and not slow" pytest -x # stop pada failure pertama pytest --maxfail=3
Test function minimal
def add(a: int, b: int) -> int:
return a + b
def test_add() -> None:
assert add(2, 3) == 5Debug dan logging
import logging
logging.basicConfig(level=logging.INFO)
logging.info("starting job")
breakpoint() # masuk debugger bawaan
# python -m pdb script.py
# python -X dev script.pyFormatting, Lint, dan Typing
Tooling yang menjaga kode Python konsisten saat dikerjakan sendiri atau dalam tim.
Ruff untuk lint dan format
ruff check . ruff check . --fix ruff format . ruff format --check .
Type hint dan mypy
from collections.abc import Iterable
def total(values: Iterable[int]) -> int:
return sum(values)
items: list[int] = [1, 2, 3]
print(total(items))
# mypy .pyproject.toml untuk Ruff dan mypy
[tool.ruff] line-length = 100 target-version = "py311" [tool.ruff.lint] select = ["E", "F", "I", "UP", "B"] [tool.mypy] python_version = "3.11" strict = true
Data dan AI Workflow
Pola cepat untuk notebook, dataset, model artifact, dan eksperimen yang tetap bisa direproduksi.
Jupyter kernel dari virtual environment
python -m pip install ipykernel jupyter python -m ipykernel install --user --name my-project --display-name "Python (my-project)" jupyter lab
Pandas load, inspect, export
import pandas as pd
df = pd.read_csv("data.csv")
print(df.head())
print(df.info())
print(df.describe(include="all"))
df.to_parquet("data.parquet", index=False)Simpan artifact eksperimen
import pickle
from pathlib import Path
artifact_dir = Path("artifacts")
artifact_dir.mkdir(exist_ok=True)
with (artifact_dir / "model.pkl").open("wb") as f:
pickle.dump(model, f)
with (artifact_dir / "model.pkl").open("rb") as f:
model = pickle.load(f)Python di Container
Dockerfile dan perintah runtime yang umum untuk service Python.
Dockerfile FastAPI sederhana
FROM python:3.12-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 8000 CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Menjalankan script Python dalam container
docker build -t my-python-app . docker run --rm -p 8000:8000 my-python-app docker run --rm -v "$(pwd)":/app -w /app python:3.12-slim python script.py