モダンPython基礎 #1 — はじめ方とuvセットアップ
このブログにはすでに 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とは何か #
uv は Astral が作っている 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 install | uv init + uv add |
| lock ファイル | requirements.txt 手管理 / poetry.lock | uv.lock 自動生成 |
| 標準互換 | ツールごとに差がある | PEP 621 の pyproject.toml をそのまま使う |
このシリーズでは uv を基本ツールとして使い、インタプリタ、仮想環境、依存関係、実行までをまとめて扱います。
インストール #
macOS / Linux:
curl -LsSf https://astral.sh/uv/install.sh | shHomebrew を使うなら:
brew install uvWindows (PowerShell):
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"インストール後は新しいターミナルを開いて、まずバージョンを確認します。
uv --version
# uv 0.5.x (またはそれ以降)Python 3.14 をインストールする #
uv は Python インタプリタ自体も直接インストールできます。もう pyenv を別で入れる必要はありません。
uv python install 3.14インストール済みのインタプリタ一覧は次で確認できます。
uv python list --installed
# cpython-3.14.x-macos-aarch64-none ...このインタプリタはシステムに常駐しますが、PATH に直接露出するわけではありません。 uv がプロジェクトごとに適切なものを自動で選びます。システムの別の Python と混ざらないので、安全に扱えます。
最初のプロジェクト #
空ディレクトリを作って、uv init でプロジェクトを初期化します。
mkdir hello-py
cd hello-py
uv init --python 3.14重要なのは --python 3.14 です。このプロジェクトは 3.14 に固定されます。別のプロジェクトが 3.12 を使っていても干渉しません。実行すると、次のようなファイルが生成されます。
hello-py/
├── .python-version # 3.14
├── pyproject.toml # プロジェクト情報 + 依存関係
├── README.md
└── main.py # print("Hello from hello-py!")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 です。
uv run main.py
# Hello from hello-py!uv run は内部で次のことをやっています。
pyproject.tomlのrequires-pythonを満たすインタプリタを探す- 必要なら自動でダウンロードする
- プロジェクト用の仮想環境 (
.venv/) を作り、uv.lockと同期する - その環境の中でコマンドを実行する
つまり、source .venv/bin/activate のように仮想環境を手で activate する必要がなくなります。今後の流れは コマンドの前に uv run を付ける という形に変わります。最初は少し違和感がありますが、慣れると「activate し忘れてシステム Python にパッケージを入れてしまう」事故がかなり減ります。
依存関係を追加する #
パッケージ追加には uv add を使います。
uv add httpxこの 1 行で、次のことが一度に行われます。
pyproject.tomlのdependenciesにhttpxが追加されるuv.lockに正確なバージョンとハッシュが記録される.venv/にインストールされる
pyproject.toml をもう一度開くと、次のようになります。
[project]
# ...
dependencies = [
"httpx>=0.28.1",
]テストランナーやリンターのように、開発時だけ必要なものは --dev グループに分けます。
uv add --dev pytest ruffこうしておけば、本番配布時には除外され、開発時だけ入ります。削除したいときは次です。
uv remove httpxもう一度、全体の流れをまとめる #
# 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以前は、同じことをするのにこれだけの手順が必要でした。
# 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 講座との感覚の違いも確認していきます。