Python

Referensi Python untuk pekerjaan software engineering, DevOps, dan AI engineering: environment, dependency, scripting, API, file/data, testing, typing, dan workflow notebook.

00

Runtime dan Environment

Pastikan versi Python, virtual environment, dan lokasi interpreter jelas sebelum memasang dependency.

Cek versi dan lokasi Python

shell
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

venv
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
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
01

Package dan Dependency

Install, freeze, audit, dan jalankan tool CLI Python dengan cara yang mudah direproduksi.

pip sehari-hari

pip
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

toml
[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

tools
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
02

Scripting dan CLI

Pola dasar untuk membuat script automation yang jelas, idempotent, dan nyaman dipanggil dari shell.

Template script aman

python
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

argparse
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

subprocess
import subprocess


result = subprocess.run(
    ["git", "status", "--short"],
    check=True,
    capture_output=True,
    text=True,
)
print(result.stdout)
03

File, JSON, YAML, dan Env

Operasi I/O yang paling sering dipakai dalam automation, backend, dan pipeline data.

Path dan file text

pathlib
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

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

env
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
import yaml


with open("compose.yml", "r", encoding="utf-8") as f:
    config = yaml.safe_load(f)

print(config["services"].keys())
04

HTTP dan API

Client HTTP, validasi payload, dan server API minimal.

HTTP client dengan requests

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

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

fastapi
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 --reload
05

Async, Thread, dan Process

Pilih model eksekusi sesuai bottleneck: I/O, CPU, atau banyak request network.

asyncio untuk I/O concurrent

asyncio
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

threads
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

processes
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])))
06

Testing dan Debugging

Perintah untuk menjalankan test, debug cepat, logging, dan profiling ringan.

pytest dasar

pytest
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

test
def add(a: int, b: int) -> int:
    return a + b


def test_add() -> None:
    assert add(2, 3) == 5

Debug dan logging

debug
import logging


logging.basicConfig(level=logging.INFO)
logging.info("starting job")

breakpoint()                      # masuk debugger bawaan

# python -m pdb script.py
# python -X dev script.py
07

Formatting, Lint, dan Typing

Tooling yang menjaga kode Python konsisten saat dikerjakan sendiri atau dalam tim.

Ruff untuk lint dan format

ruff
ruff check .
ruff check . --fix
ruff format .
ruff format --check .

Type hint dan mypy

typing
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

toml
[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
08

Data dan AI Workflow

Pola cepat untuk notebook, dataset, model artifact, dan eksperimen yang tetap bisa direproduksi.

Jupyter kernel dari virtual environment

jupyter
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

pandas
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

pickle
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)
09

Python di Container

Dockerfile dan perintah runtime yang umum untuk service Python.

Dockerfile FastAPI sederhana

Dockerfile
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
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