4 min read

Mencoba UV: Pengelola Paket Python (Lagi...)

Mencoba UV: Pengelola Paket Python (Lagi...)
Photo by Artturi Jalli / Unsplash

Jika kita berbicara mengenai bahasa pemrograman populer yang dianggap ramah pemula, Python hampir selalu masuk dalam daftar. Struktur penulisannya yang sederhana, ekosistem yang luas, serta banyaknya tutorial yang tersedia menjadikannya pilihan yang baik bagi pemula.

Namun, meskipun Python ramah pemula, pengelolaan paketnya sering kali membingungkan, bahkan bagi yang sudah berpengalaman sekalipun. Secara default, Python memasang paket di level global, berbeda dengan JavaScript yang menggunakan node_modules atau PHP dengan vendor. Selain itu, jika JavaScript memiliki package.json dan PHP memiliki composer.json, Python menggunakan pendekatan berbeda. Tidak ada satu berkas khusus yang secara otomatis mencatat dependensi, tetapi kita bisa mencatatnya secara manual menggunakan perintah:

python -m pip freeze [options]

Perintah ini akan mencatat semua paket yang telah terpasang di sistem ke dalam sebuah berkas. Namun, karena pemasangan paket dilakukan secara global, ada kemungkinan paket yang tidak dibutuhkan ikut terbawa. Akibatnya, jika daftar ini digunakan dalam proyek lain, proyek tersebut bisa menjadi lebih besar dari yang seharusnya.

Oleh karena itu, banyak orang menyarankan penggunaan virtual environment untuk mengisolasi dependensi proyek dan menghindari masalah tersebut.

Virtual Environment

Dalam menggunakan virtual Environment (selanjutnya kita singkat venv) bisa dibilang belum memiliki cara standar dan banyak pendekatan di luar sana yang berbeda-beda. Beberapa cara populer untuk menggunakan venv

  1. venv bawaan python
  2. pipenv
  3. poetry
  4. conda

Saya sendiri baru pernah menggunakan nomor 1-3, ketiganya mempunya format yang berbeda-beda dan keunggulan masing-masing tentunya, terakhir muncul pesaing baru bernama uv yang memiliki jualan utamanya kecepatan karena dibuat dengan bahasa Rust.

Mencoba UV

Secara singkat, UV tidak jauh berbeda dalam penggunaannya dengan Poetry maupun Pipenv. Namun, jika dibandingkan, UV memiliki keunggulan dalam kecepatan saat melakukan package resolution, yang lebih cepat dibandingkan kedua aplikasi tersebut.

Untuk menggunakan UV, kita dapat menjalankan perintah berikut:

uv init <<folder>>

cd <<folder>>

uv add <<nama paket>>

Dan isi projek uv secara awal akan seperti berikut.

├── README.md
├── hello.py
└── pyproject.toml

Menjalakan berkas python melalui uv sedikit berbeda, kita harus memulai dengan uv run <<nama berkas>>

uv run hello.py
>> Hello from projek!

Sedangkan pyproject.toml ini setara dengan package.json maupun composer.json, ini contoh berkas pyproject.toml untuk aplikasi fastapi milik saya.

name = "fapi-kit"
version = "0.1.0"
description = "Fast api rest api starter kit"
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
    "anyio>=4.7.0",
    "assertpy>=1.1",
    "asyncpg>=0.30.0",
    "black>=24.10.0",
    "fastapi[standard]>=0.115.6",
    "filelock>=3.16.1",
    "freezegun>=1.5.1",
    "ipdb>=0.13.13",
    "isort>=5.13.2",
    "loguru>=0.7.3",
    "psycopg>=3.2.3",
    "pyjwt>=2.10.1",
    "pytest-asyncio>=0.25.0",
    "pytest-mock>=3.14.0",
    "pytest-xdist>=3.6.1",
    "python-dotenv>=1.0.1",
    "pytz>=2024.2",
    "ruff>=0.8.4",
    "trio>=0.28.0",
]

Di balik kemudahannya, ada beberapa hal dari UV yang mungkin terasa mengganggu.

Perintah seperti uv run <berkas>, uv add <nama paket>, dan uv ... merupakan sesuatu yang baru. Terkadang, perubahan seperti ini bisa terasa kontraproduktif karena berbeda dari standar bawaan Python.

Namun, bagi saya, daya tarik UV justru bukan hanya dari pengelolaan paketnya, tetapi juga karena banyak fitur berguna, terutama untuk kebutuhan proof of concept. Berikut utilitas UV yang sering saya gunakan:

Contoh, saya memiliki berkas seperti berikut

import sys
print(sys.version)

Lalu saya jalankan dengan beberapa versi

➜ python main.py
3.13.1 (v3.13.1:06714517797, Dec  3 2024, 14:00:22) [Clang 15.0.0 (clang-1500.3.9.4)]
➜ uv run main.py
3.13.1 (main, Dec 19 2024, 14:22:59) [Clang 18.1.8 ]
➜ uv run --python 3.12 main.py
3.12.8 (main, Dec 19 2024, 14:22:58) [Clang 18.1.8 ]

Karena dapat menjalankan berbagai versi, kita bahkan bisa menguji kode dengan cepat di beberapa versi Python sekaligus.

➜   uv run --with '.[test]' pytest
===================================================================== test session starts =====================================================================
platform darwin -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: /Users/ariesm/code/python/blog
collected 1 item

test_simple_math.py .                                                                                                                                   [100%]

====================================================================== 1 passed in 0.00s ======================================================================
➜   uv run --python 3.11 --with '.[test]' pytest
===================================================================== test session starts =====================================================================
platform darwin -- Python 3.11.11, pytest-8.3.4, pluggy-1.5.0
rootdir: /Users/ariesm/code/python/blog
collected 1 item

test_simple_math.py .                                                                                                                                   [100%]

====================================================================== 1 passed in 0.00s ======================================================================
➜   uv run --python 3.12 --with '.[test]' pytest
===================================================================== test session starts =====================================================================
platform darwin -- Python 3.12.8, pytest-8.3.4, pluggy-1.5.0
rootdir: /Users/ariesm/code/python/blog
collected 1 item

test_simple_math.py .                                                                                                                                   [100%]

====================================================================== 1 passed in 0.00s ======================================================================
➜  
pastikan sebelum melakukan pengetesan seperti di atas anda memiliki konfigurasi setup.py

Referensi:

Installing and managing Python | uv
A guide to using uv to install Python, including requesting specific versions, automatic installation, viewing installed versions, and more.
Running pytest against a specific Python version with uv run
While working on this issue I figured out a neat pattern for running the tests for my project locally against a specific Python version using uv run :
Notes - Rezha Julio
Abusing computers for Fun and Profit