モダンPython基礎 #1 — はじめ方とuvセットアップ

読了 5分

このブログにはすでに Python基礎講座 があります。2017年に始めたシリーズで、当時の Python 3.5 から 3.9 あたりのコードや画面がそのまま残っています。しかし、その後の Python はかなり変わりました。そこで 旧シリーズはそのまま残しつつ、今あらためて Python を始めるならどう学ぶかを、7本構成で整理し直します。

  • #1 はじめ方と uv セットアップ ← 今回
  • #2 変数、基本型、型ヒント
  • #3 制御フロー — if, while, for, match-case
  • #4 コレクションと内包表記
  • #5 関数 — 引数パターン
  • #6 エラーと例外処理
  • #7 モジュール、パッケージ、pyproject.toml

なぜもう一度Pythonなのか #

旧講座の時代の Python と、今の Python は、同じ言語と呼ぶには少し違いすぎるくらい変化しています。大きなものだけ挙げても、次のような違いがあります。

  • 型ヒント が事実上の標準になり、ライブラリコードの大半に型が付くようになった
  • match-case (3.10) により、JavaScript の switch とは少し性格の違うパターンマッチが使える
  • 組み込みジェネリクス (3.9) で list[int], dict[str, int] のように直接書ける
  • Union の短縮記法 (3.10) により Optional[int] の代わりに int | None が使える
  • exception group (3.11) により except* で同時発生した例外を扱える
  • free-threaded (3.13〜3.14, PEP 779) により GIL なしビルドが正式サポート段階に入った
  • t-string (3.14, PEP 765) により、f-string とは異なる遅延補間テンプレートが加わった
  • lazy annotations (3.14, PEP 649) により、アノテーションはデフォルトで遅延評価されるようになった

ツールチェーンもほとんど入れ替わりました。pip を直接たたく、requirements.txt を手で管理する、virtualenv を毎回 activate する といった昔の流れは、今ではかなり減っています。代わりに、その役割をほぼ一手に引き受けるのが uv です。

uvとは何か #

uvAstral が作っている Rust 製の Python パッケージ兼プロジェクトマネージャ です。Ruff を作っているチーム、と言った方が伝わりやすいかもしれません。

一言でまとめると、こういう道具です。

pip + pip-tools + pipx + poetry + pyenv + virtualenv を 1 つのバイナリにまとめて、10〜100倍速くしたもの

なぜ標準候補になりつつあるのか、ざっくり比較すると次の通りです。

従来ツールuv
速度数十秒〜数分数百ms
Python インタプリタの導入pyenv を別途利用uv python install 一発
プロジェクト初期化python -m venv + source .venv/bin/activate + pip installuv init + uv add
lock ファイルrequirements.txt 手管理 / poetry.lockuv.lock 自動生成
標準互換ツールごとに差があるPEP 621 の pyproject.toml をそのまま使う

このシリーズでは uv を基本ツールとして使い、インタプリタ、仮想環境、依存関係、実行までをまとめて扱います。

インストール #

macOS / Linux:

install uv
curl -LsSf https://astral.sh/uv/install.sh | sh

Homebrew を使うなら:

install via brew
brew install uv

Windows (PowerShell):

windows install
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

インストール後は新しいターミナルを開いて、まずバージョンを確認します。

check version
uv --version
# uv 0.5.x  (またはそれ以降)

Python 3.14 をインストールする #

uv は Python インタプリタ自体も直接インストールできます。もう pyenv を別で入れる必要はありません。

install Python
uv python install 3.14

インストール済みのインタプリタ一覧は次で確認できます。

list installed Pythons
uv python list --installed
# cpython-3.14.x-macos-aarch64-none ...

このインタプリタはシステムに常駐しますが、PATH に直接露出するわけではありません。 uv がプロジェクトごとに適切なものを自動で選びます。システムの別の Python と混ざらないので、安全に扱えます。

最初のプロジェクト #

空ディレクトリを作って、uv init でプロジェクトを初期化します。

initialize project
mkdir hello-py
cd hello-py
uv init --python 3.14

重要なのは --python 3.14 です。このプロジェクトは 3.14 に固定されます。別のプロジェクトが 3.12 を使っていても干渉しません。実行すると、次のようなファイルが生成されます。

generated files
hello-py/
├── .python-version    # 3.14
├── pyproject.toml     # プロジェクト情報 + 依存関係
├── README.md
└── main.py            # print("Hello from hello-py!")

pyproject.toml を開くと、こうなっています。

pyproject.toml
[project]
name = "hello-py"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.14"
dependencies = []

これは PEP 621 標準の形そのままです。このファイルがプロジェクトの単一の定義 だと考えると分かりやすいでしょう。依存関係、Python バージョン、ビルド情報、ruff や mypy のようなツール設定まで、全部ここに集まります。これからは requirements.txt, setup.py, setup.cfg を新しく作る場面はかなり減ります。

最初の実行 #

生成された main.py をそのまま実行してみます。ただし python main.py ではなく、uv run main.py です。

first run
uv run main.py
# Hello from hello-py!

uv run は内部で次のことをやっています。

  1. pyproject.tomlrequires-python を満たすインタプリタを探す
  2. 必要なら自動でダウンロードする
  3. プロジェクト用の仮想環境 (.venv/) を作り、uv.lock と同期する
  4. その環境の中でコマンドを実行する

つまり、source .venv/bin/activate のように仮想環境を手で activate する必要がなくなります。今後の流れは コマンドの前に uv run を付ける という形に変わります。最初は少し違和感がありますが、慣れると「activate し忘れてシステム Python にパッケージを入れてしまう」事故がかなり減ります。

依存関係を追加する #

パッケージ追加には uv add を使います。

add a dependency
uv add httpx

この 1 行で、次のことが一度に行われます。

  • pyproject.tomldependencieshttpx が追加される
  • uv.lock に正確なバージョンとハッシュが記録される
  • .venv/ にインストールされる

pyproject.toml をもう一度開くと、次のようになります。

dependencies added
[project]
# ...
dependencies = [
    "httpx>=0.28.1",
]

テストランナーやリンターのように、開発時だけ必要なものは --dev グループに分けます。

dev dependencies
uv add --dev pytest ruff

こうしておけば、本番配布時には除外され、開発時だけ入ります。削除したいときは次です。

remove
uv remove httpx

もう一度、全体の流れをまとめる #

zero-to-running in one go
# 1. ツールを入れる(一度だけ)
curl -LsSf https://astral.sh/uv/install.sh | sh

# 2. プロジェクトを作る
uv init my-app --python 3.14
cd my-app

# 3. 依存関係を追加する
uv add httpx
uv add --dev pytest

# 4. 実行する
uv run main.py
uv run pytest

以前は、同じことをするのにこれだけの手順が必要でした。

old flow (for reference)
# pyenv で Python を入れる
pyenv install 3.14.0
pyenv local 3.14.0

# 仮想環境を作る
python -m venv .venv
source .venv/bin/activate

# 依存関係をインストール
pip install httpx
pip install pytest
pip freeze > requirements.txt

# 実行
python main.py

この時点で、uv を中心にしたモダンな Python 開発の入口はつかめたはずです。次回は、変数、基本型、型ヒントをまとめて見ながら、旧 Python 講座との感覚の違いも確認していきます。

X