パイソンエンジニア部https://python-engineer.co.jpWed, 16 Jul 2025 08:40:17 +0000jahourly1https://python-engineer.co.jp/wp-content/uploads/2024/06/cropped-パイソンエンジニア部-32x32.pngパイソンエンジニア部https://python-engineer.co.jp3232 Cursorで覚えておきたいショートカットキーhttps://python-engineer.co.jp/cursor-shortcutkey/Sat, 21 Jun 2025 22:08:58 +0000https://python-engineer.co.jp/?p=1367

Cursor を使う上で欠かせないのがショートカットキーです。ここではよく使うショートカットキーを厳選して表にまとめました。一気に覚えるのは難しいですが、一つずつ身につけていってください。 覚えるときのコツとして、「メニ ... ]]>

Cursor を使う上で欠かせないのがショートカットキーです。ここではよく使うショートカットキーを厳選して表にまとめました。一気に覚えるのは難しいですが、一つずつ身につけていってください。

覚えるときのコツとして、「メニューやアイコンの隣にはショートカットキーが書いてある」という法則を覚えておいてください。

下の図のように画面上部のメニューやアイコンにカーソルを合わせるとショートカットキーが表示されます。始めは、メニューやアイコンをクリックして実行するのは、出し方ありませんが、その時どのようなショートカットキーが使えるか、合わせて覚え、次回からはそのショートカットキーを使って実行するようにすれば、だんだん身についていきます。

CleanShot20250622064817@2x.jpg

CleanShot20250622060815@2x.jpg

ショートカットキーで操作すると、より効率的に操作できるようになり、その分、試行回数が増えて技術習得が早くなります。

エディタでの編集系

ショートカット (Win/Mac)機能説明
Ctrl+Z/Cmd+Z元に戻す編集部分を元に戻す
Ctrl+Y/Cmd+Shift+Zやり直し「元に戻す」を元に戻す
Ctrl+X/Cmd+X切り取り選択範囲を切り取り
Ctrl+C/Cmd+Cコピー選択範囲をコピー
Ctrl+V/Cmd+V貼り付けクリップボードにあるものを貼り付け
Ctrl+F/Cmd+F検索エディタ内で検索
Ctrl+H/Cmd+Opt+F置換エディタ内で置換

コード実行系

ショートカット (Win/Mac)機能説明
F5/F5デバッグ実行デバッグモードで実行
Ctrl+F5/Ctrl+F5実行実行 (高速 & ブレークポイントを無視)
F9/F9ブレークポイント設置/削除ブレークポイントが設置されているところには赤丸が表示される
F10/F10ステップオーバーデバッグ時に現在の行を実行して次の行に移る (関数内部に入らない)
F11/F11ステップインデバッグ時に現在の行を実行して次の行に移る (関数内部に入る)
Shift+F11/Shift+F11ステップアウトデバッグ時の呼び出し元への遷移

F5 と Ctrl+F5 の違い

ショートカット (Win/Mac)モード説明
F5/F5デバッグモードで実行ブレークポイントで停止し、変数の値を確認できる
Ctrl+F5/Ctrl+F5通常実行デバッグ機能を使わずに高速で実行

ペイン表示/非表示切り替え系

ショートカット (Win/Mac)機能説明
Ctrl+B/Cmd+Bサイドバー表示/非表示左サイドバーの表示/非表示
Ctrl+Shift+E/Cmd+Shift+Eエクスプローラをアクティブにファイル・フォルダ管理画面の表示/非表示
Ctrl+Shift+F/Cmd+Shift+F検索/置換ダイアログを表示プロジェクト内の複数ファイルから検索
Ctrl+J/Cmd+Jパネル表示/非表示ターミナルなどの下部パネルの表示/非表示
Ctrl+@/Cmd+@ターミナル表示/非表示ターミナルの表示/非表示
Ctrl+I/Cmd+ICursor ペイン表示/非表示Cursor の基本 AI 機能

Cursor AI 操作系

ショートカット (Win/Mac)機能説明
Ctrl+I/Cmd+ICursor ペイン表示/非表示Cursor の基本 AI 機能
Ctrl+L/Cmd+L選択範囲を AI の参照に追加コードペイン、ターミナルペインで範囲選択可能
Ctrl+K/Cmd+K選択範囲についてその場で相談Cursor の基本 AI 機能

コマンドパレット操作系

ショートカット (Win/Mac)機能説明
Ctrl+P/Cmd+Pクイックオープンファイル名で検索してファイルを開く
Ctrl+Shift+P/Cmd+Shift+Pコマンドパレットすべてのコマンドにアクセス

コマンドパレットとは Cursor の機能を文字列で検索できる機能です。日本語、英語どちらにも対応しています。

その他コードペインに関連するもの

ショートカット (Win/Mac)機能説明
Ctrl+/ / Cmd+/コメント/非コメント化コメント/非コメント化
Ctrl+G/Cmd+G指定された行に移動行番号を指定して移動
F12/F12定義に移動定義に移動
Ctrl+F4/Cmd+Wコードタブを閉じるタブの操作
]]>
Cursorを使うならGitも同時にhttps://python-engineer.co.jp/cursor-for-git/Sat, 21 Jun 2025 08:03:41 +0000https://python-engineer.co.jp/?p=1353

Cursor を使うならバージョン管理システムの Git (ギット) も同時に使いましょう。Git とは Web サーバーで最も使われる OS である Linux を開発したリーナス・トーバルズが開発したバージョン管理シ ... ]]>

Cursor を使うならバージョン管理システムの Git (ギット) も同時に使いましょう。Git とは Web サーバーで最も使われる OS である Linux を開発したリーナス・トーバルズが開発したバージョン管理システムです。現代のソフトウェア開発には欠かせないシステムです。

Pasted image 20250619160101.png

ソフトウェア開発者であれば Git を使うのは常識ですが、開発経験がない方のためになぜ Cursor でも Git を使うべきなのかを解説します。

Cursor のセーブポイントを作るために Git を使う

Cursor で AI と協働して作業しているとしばしばファイルがぶっ壊れます。その他にも AI と一緒に開発を進め、いろいろ作業したあとで「やっぱりあのときのやつがよかったな」ということがあります。そんなときのためにゲームのように「セーブポイント」を作っておくとやり直しがしやすいですよね。そのセーブポイントを作るためのシステムが Git です。

要するにアクセルの踏み方を覚える前にブレーキやハンドルのコントロール方法を身につけておきましょう、という話です。

Git のインストール方法

Git を使うには PC/Mac にインストールします。Windows と Mac でインストール方法が異なるのでそれぞれ解説します。

Windows

Windows で Git をインストールするには公式サイトからインストールするのが最も手軽です。

公式サイト Git – Downloading Package

CleanShot20250619161059@2x.jpg

ダウンロードしたインストーラーを起動してインストールしていきます。設定項目が多数ありますがほとんど初期設定のままで構いません

CleanShot20250621162641@2x.jpg

変更を加えることを許可

CleanShot20250621162712@2x.jpg

後はずっと初期設定のまま Next を押していく

CleanShot20250621162745@2x.jpg

インストール先の設定

CleanShot20250621162805@2x.jpg

すでにその場所にフォルダがある場合は下図が表示される。その場合も「はい」で進む

CleanShot20250621162844@2x.jpg

オプションのインストール選択。これも初期設定のまま Next

CleanShot20250621162856@2x.jpg

スタートメニューの設定。これも初期設定のまま Next

CleanShot20250621162907@2x.jpg

コミットメッセージ等の入力に使用するテキストエディターを選択。初期設定は Vim になっているがここだけ Use Notepad (メモ帳) にしておくとよいかと。(後で変えられるので Vim のままでも構いません)

CleanShot20250621163426@2x.jpg

git init コマンドでリポジトリを作成したとき、最初に作成されるブランチ名を指定。初期設定のままで Next

CleanShot20250621163458@2x.jpg

環境変数の設定。ここも初期設定のままで Next

CleanShot20250621163521@2x.jpg

OpenSSH のインストール。ここも初期設定のまま Next

CleanShot20250621163535@2x.jpg

HTTPS 接続の設定。ここも初期設定のまま Next

CleanShot20250621163605@2x.jpg

改行コードの設定。ここも初期設定のまま Next

CleanShot20250621163704@2x.jpg

ターミナルの設定。ここも初期設定のまま Next

CleanShot20250621163731@2x.jpg

git pull コマンドの設定。ここも初期設定のまま Next

CleanShot20250621163742@2x.jpg

資格情報マネージャーの選択。ここも初期設定のまま Next

CleanShot20250621163809@2x.jpg

追加オプションの設定。ここも初期設定のままで OK です。これが最後の項目なので Install を押してようやくインストールが始まります。

CleanShot20250621163828@2x.jpg

インストールが終わるのを待ちます。

CleanShot20250621163842@2x.jpg

インストールが終わったらチェックを外して Finish

CleanShot20250621163925@2x.jpg

インストールできたか確認します。エクスプローラーのアドレスバーに cmd と入力して Enter を押します。

CleanShot20250621164122@2x.jpg

コマンドプロンプトが起動するので git --version と入力して Enter キーを押してください。以下のようにバージョンが表示されればインストール成功です。

git version x.x.x
CleanShot20250621164155@2x.jpg

Mac

Mac の場合は始めから Git がインストールされています。ただしターミナルでコマンドを入力してもすぐに使えません。使えるようにするため以下のように操作してください。

  1. Launchpad か Spotlight に「ターミナル」と入力して起動する
    Pasted image 20250619165142.png
  2. コマンド git --version を入力して Enter キーを押す
    CleanShot20250619165243@2x.jpg
  3. 「ツールを今すぐインストールしますか?」でインストールする
    CleanShot20250619165315@2x.jpg

以上です。

Git の初期設定

Git を使うためにはユーザー名とメールアドレスを設定します。これは誰がプログラムを更新したか分かるようにするために設定する必要があります。以下のコマンドをターミナルに入力します。ユーザー名、メールアドレスはあなたの環境に合わせて設定してください。

1 つずつコマンドをコピペして実行してください。

git config --global user.name "ユーザー名"
git config --global user.email "メールアドレス"

GitHub にも登録しておく

Git をインストールしたらついでに GitHub にも登録しておきましょう。Git は PC/Mac のローカル (そのコンピュータだけで) バージョン管理するだけですが、GitHub はその状態をクラウドでも管理できるようにするものです。現在 Microsoft の傘下にあります。無料で使えます。

GitHub の右上にある Sign up からアカウント登録してください。

CleanShot20250619171453@2x.jpg

単純に Cursor を使うだけであれば GitHub アカウントは必須ではありませんが、ソフトウェア開発者であれば必ずアカウントを持っているものですし、連携すると高度な機能が使えるようになりますのでこのタイミングで作っておきましょう。

GitHub はクラウドでバージョン管理するもの、と先述しました。そのため職場で開発中の状態を自宅で再現し、開発を継続してその状態をクラウドに同期、職場でも自宅で進めた作業の続きを行う、ということができるようになります。

というとても便利なものですが、ここでは GitHub の使い方は割愛します。

レポジトリの作成

Cursor でセーブポイントを作るためにまずは「レポジトリ (repository)」というセーブポイントの保管場所を作ります。ターミナルにコマンドを入力して行うこともできますが初心者のわかりやすさ優先のため GUI (グラフィカルユーザインターフェース) で操作する方法を解説します。

まずは下図の①をクリックして「ソース管理」を表示します。そんなの見当たらないんだけど、、、という場合は Ctrl+B/Cmd+B を押してみてください。

ソースとはソースコードのことで、コンピュータに指令するための文字列のことで、ざっくりいうとプログラムのことです。

CleanShot20250619174335@2x.jpg

つづいて②をクリックしてレポジトリを初期化します。するとこれを実行したときの私の環境では以下のように表示されました。下図の枠囲みした部分がバージョン管理の対象のファイルです。([[Cursorの画面の見方と各機能の使い方#プログラムの実行・デバッグ]] の作業を行ってください)

CleanShot20250619174624@2x.jpg

そもそもなぜこのように表示されるかというと Cursor で開いているフォルダが下図のようなファイル、フォルダがあるためです。

  • .venv
  • .vscode とその配下に launch.json というファイル
  • basic.py
CleanShot20250619175009@2x.jpg

「.venv」が「ソース管理」に表示されていないんじゃない? と気がついたあなた、鋭いです。この .venv は仮想環境というもので普通はバージョン管理の対象にしません。なので気を利かせてソース管理に入っていません。

それから .vscode というフォルダと配下のファイルもソース管理の対象にしないことがあります。なのでそのための設定を行います。設定ファイルを作って、管理対象から外すファイル・フォルダ群をいろいろ記述して、ということをする必要があるのですが面倒なので拡張機能でサクッとできるようにしましょう。

ソース管理しないファイル・フォルダを設定する

「gitignore (ギットイグノア)」というやつです。ignore は無視という意味ですね。これをインストールします。

CleanShot20250619180720@2x.jpg

インストールしたらコマンドパレットを表示して「ignore」と入力し「Add gitignore」を選択し、(コマンドパレットは Ctrl+Shift+P/Cmd+Shift+P )

CleanShot20250619180948@2x.jpg

次の入力欄に「python」と入力して実行します。

CleanShot20250619181143@2x.jpg

すると下図のように .gitignore というファイルが追加されます。このファイルの中にはなにやらいろいろ書いてありますがこれはソース管理から無視するファイル・フォルダの名前です。

CleanShot20250619181338@2x.jpg

.gitignore を設定するときにテキストボックスに python と入力しましたが、これは python を扱うときによく設定されるものが詰め合わせセットになっています。しかし .vscode は入っていないので追加しましょう。

.gitignore のどこに記述してもいいのですがここでは末尾に追記します。.vs まで入力すると下図のようにサジェスト (提案) されるので Tab キーを押して確定し、Ctrl+S/Cmd+S で上書き保存してください。

CleanShot20250619181851@2x.jpg

この状態でもう一度「ソース管理」を開いてください。先ほどまでここにあった .vscode というフォルダが表示されていなければ成功です。すぐ表示更新されないことがありますので、その場合は再読み込みアイコンをクリックしてください。

CleanShot20250619182007@2x.jpg

2 種類のセーブポイント

これでひとまず Git でセーブポイントを作る準備ができました。では、セーブポイントを作っていきましょう。セーブポイントには、「仮のセーブポイント」と、「ちゃんとしたセーブポイント」の 2 つがあります。

Git のシステムでは仮のセーブポイントのことを「ステージ」、ちゃんとしたセーブポイントのことを「コミット」と呼びます。ここから先はその呼び方にしていきます。

コミット

まずざっくりとした理解をしていきましょう。コミットは正式な記録をつける領域で、「いつ、どのファイルに、どのような変更を行ったか」を記録します。そのさいどのような変更を行ったか振り返りやすいように、コメントをつけます。こうしておけば後から振り返った時に変更内容がすぐ分かりますし、その時のバージョンに戻せば、ファイルの中身をその時の状態に戻せます。

例えば下図はあるプロジェクトのコミット履歴です。

CleanShot20250620155604@2x.jpg

エディターで開かれている背景が緑色になっている部分は変更した箇所、赤色の部分は変更前の状態を表しています。

アクティビティバーにずらっと並んだコメントをクリックすると、その時どのような変更が行われたかがすぐわかります。

これがちゃんとしたセーブポイント、コミットによるバージョン管理です。Cursor で開発を進めるときはある程度実装して一区切りついたな、というところでコミットします。例えばログイン機能のための画面ができた、ファイル読み込み機能が一通りできた、グラフ作成機能が一通りできた、などのタイミングです。実際どのような区切りでコミットするかはチームの規約や経験によって変わってきます。

ステージ

ちゃんとしたセーブポイントであるコミットに対し、仮のセーブポイントであるステージはコミットしたいファイルを仮置きしておく領域です。ステージングエリアと呼びます。AI と協働して開発を進めるときはこれがなかなか便利なのです。

ステージ〜コミットまで

それでは変更をステージしていきましょう。現在のソース管理は下の図のようになっています。それぞれのファイルのところにマウスカーソルを持っていくといくつかのアイコンが現れます。

①が変更をステージするアイコン。その左隣にあるのは変更を元に戻すアイコン。その左隣にあるのはファイルを開くアイコンです。①の右上にある青い②は変更されたファイルが 2 つあることを表しています。

CleanShot20250620173400@2x.jpg

赤い②はコミット履歴 (セーブポイント履歴) がないことを表しています。 (セーブポイントには何もセーブされていません)

ちなみに下の図のように変更のところにカーソルを持っていくと変更があったファイルをまとめてステージしたり、元に戻したりすることもできます。

CleanShot20250620174249@2x.jpg

では話を戻して、basic.py をステージしてみましょう。

CleanShot20250620174805@2x.jpg

これでコミットできる準備が整いました。 メッセージを入力して①、コミットボタンを押せばコミットできます②。ではやってみましょう。コミットメッセージは、first commit としておきます。ちなみにメッセージ入力欄の右端にあるキラキラアイコンを使えば AI がコミットメッセージを作ってくれます。

CleanShot20250620175123@2x.jpg

下の図のようになれば成功です。コミット履歴をクリックすると、basic.py の変更点がエディターで開かれます。

CleanShot20250620175208@2x.jpg

では、 .gitignore もステージ → コミット、という一連の流れをやってみましょう。コミットメッセージは、second commit としておきます。

CleanShot20250620175623@2x.jpg

変更を元に戻す 2 つの方法

次はファイルに加えた変更を元に戻す 2 つの方法を解説します。ステージされたものを元に戻すのか、ステージされていないものを元に戻すのか、という 2 つです。

これらは Cursor で AI と協働して開発しているときに非常に便利です。例えば以下のような場面で活用できます。

  • AI に「この機能を改良して」と依頼し提案を受け入れてみたものの、試してみたら期待と違った
  • AI エージェントが編集中にファイルを壊した

ステージされているものを元に戻す

ステージされているものを元に戻すと、「ステージした時点」の状態に戻せます。ある程度の複雑性を持ったコードはひと区切りであるコミットまで複数回 AI エージェントとチャット・コード編集することになります。そんなときに細かく足場を固めていくために使います。

AI エージェントが編集したコードを受け入れ期待通りの動きになっていれば、ステージする。そして次に行ったやりとりによる変更でも期待通りになっていれば、またステージする、というように使います。

このようなサイクルにおいて、編集されたコードを受け入れてみたものの、実際試してみたら期待と違った時に細かくステージしていれば作業しやすくなります。

ロッククライミングで例えると細かく杭を打ち込んで少しずつ足場を固めていくイメージです。細かく打ち込んであれば滑落した時にその杭の場所でとどまることができます。一方、杭を細かく打ち込んでいなければ一気に下まで落ちてしまう = コミットしたところまで戻ってしまうというイメージです。

ステージされていないものを元に戻す

ステージされていないものを元に戻すと、「コミットしたところ」まで戻ります。AI エージェントが提案して受け入れた機能の一つ一つはちゃんと動くんだけど、最終的に統合したときになんだかうまく機能しないといったこともあります。イチから全部やり直そうときにそれまで行ってきた変更を一気に元に戻すといったときに使ったりします。

本来であれば、レポジトリ (セーブポイント) にブランチ (枝) を作って新機能を実装していくという流れが正しいのですが、ブランチを作るまでもないだろうと高をくくっていたものが、やってみたら意外と複雑になってしまい、なおかつ AI が思うように実装してくれなかった、といった時なんかに使えます。

Cursor で変更を元に戻す操作方法

ステージした変更を破棄する手順

では実際に Cursor で元に戻す操作を行ってみましょう。basic.py に適当な変更を加え、変更をステージしてみます。

a = 'apple'
print(a)
# ↓を加える
print(a[0])

こんな風に AI によって複数行の変更が提案されますが、Esc キーを押して提案を却下しておいてください。

CleanShot20250621100049@2x.jpg

CleanShot20250621094655@2x.jpg
4 行目、5 行目の右隣に緑色のバーが表示されていますが、これはコミット以降変更が加えられた行を表しています。

ステージに追加すると下の図のように「ステージされている変更」に表示されるようになりました。4 行目、5 行目の右隣のバーも消えました。

CleanShot20250621093010@2x.jpg

次は以下のように変更を加えます。

a = 'apple'
print(a)
print(a[0])
# ↓を加える
print(a[1])

すると、「ステージされている変更」と「変更」の両方に basic.py が表示されるようになりました。6 行目の右隣に緑色のバーが表示されていますが、これは、ステージ以降に変更が加えられた行を表しています。

CleanShot20250621093556@2x.jpg

次は以下のようにしてみます。7 行目にも緑色のバーが表示されました。この状態で「変更を破棄」をクリックすると、緑色のバーが表示されている部分は、元に戻ります。

a = 'apple'
print(a)
print(a[0])
print(a[1])
# ↓を加える
print(a[2])
CleanShot20250621094210@2x.jpg

次のようなダイアログが表示されるので「変更を破棄」を選択すると

CleanShot20250621094302@2x.jpg

下の図のようにステージした時点に戻りました。

CleanShot20250621093010@2x.jpg

変更のステージング解除

次は「変更のステージング解除」から、コミット時点までの変更を破棄するという流れを見ていきます。下の図の変更のステージング解除をクリックしてください。

CleanShot20250621094504@2x.jpg

すると下の図のようになります。4 行目、5 行目に緑色のバーが表示されました。これはコミット以降変更が加えられたことを表していると説明した通りです。この状態で「変更を破棄」をクリックすると、4 行目、5 行目が破棄されます。

CleanShot20250621095223@2x.jpg

再びダイアログが表示されるので変更を破棄します。

CleanShot20250621094302@2x.jpg

これで、コミット時点まで一気に戻ることができます。

細かくステージしていく練習

先ほどは 6 行目、7 行目の変更を加えた時に細かくステージしていませんでしたので今度は細かくステージしていく練習をしてみましょう。

この状態で再び変更をステージ。

CleanShot20250621094655@2x.jpg

6 行目に変更を加えて、再び変更をステージ。

CleanShot20250621100420@2x.jpg

7 行目にも変更を加えて再びステージ。

CleanShot20250621100604@2x.jpg

次は 8 行目に変更を加えてみます。この状態で変更を破棄するとどこまで戻るかわかりますか?

CleanShot20250621100840@2x.jpg

正解は最後にステージしたところまで = 7 行目までです。下の図の状態まで戻ります。

CleanShot20250621101101@2x.jpg

細かくステージすればするほど、その時点の状態を一時保存しておけるというイメージがついたのではないでしょうか。

Cursor では「元に戻す」機能はこれ以外にも AI とのチャットスレッドのある時点に戻すボタンがあります。下図の矢印で示したボタン「Restore checkpoint」をクリックすると AI エージェントが加えた変更をその時点に戻って別の変更を依頼できます。

CleanShot20250621101812@2x.jpg

実際にはこうした機能もうまく組み合わせながら試行錯誤してプログラムを作っていくことになります。次はこの機能との組み合わせを見てみます。

Restore checkpoint

Restore checkpoint (Restore = 元に戻す) の機能を説明するとともに、AI エージェントとチャットしながら開発する方法も併せて解説していきます。

まずは下の図のようにチャット欄に「フィボナッチ数列を表示する関数を実装」と入力して↑ボタンを押すか Enter キーを押してください。

CleanShot20250621103143@2x.jpg

すると下図のようになります。矢印で示した②③④の Accept をクリックすると提案されたコードを受け入れます。

②はそのブロックを受け入れるボタンです。画像ではブロックが一つしか表示されていませんがもっと規模が大きな変更ではこのボタンが複数箇所に現れます。それを一つ一つレビュー評価してボタンを押していきます。Reject をクリックすると提案を拒否します。

CleanShot20250621102635@2x.jpg

③はファイルに加えられた変更をすべて受け入れるボタンです。また、今回の依頼では一つのファイルにしか変更を加えていませんが、規模が大きくなると複数ファイルにまたがって変更が加えられることがあります。そういう時は次のファイルもしくは前のファイルを表示するボタンが表示されます。

④は、今回のやりとりで加えられた変更をすべて一括で受け入れるボタンです。バイブコーディングの場合は、③か④を多用することになると思います。

今回のフィボナッチ数列を表示する関数を実装という依頼はすべて受け入れるようにしておきます。

続けて変更をステージします。

CleanShot20250621104145@2x.jpg

次は Restore checkpoint の機能を使って、加えた変更をなかったことにして別の依頼をしてみます。下の図の矢印部分に入力されていた「フィボナッチ数列を表示する関数を実装」を消して、「fizzbuzz 関数を実装」に書き換えて、Enter キーを押します。

CleanShot20250621104315@2x.jpg

すると下の図のようなダイアログが表示されます。 これは

以前のメッセージから送信しますか?前のメッセージから送信すると、ファイルの変更がこのメッセージの前に戻され、このメッセージ以降のメッセージは消去されます。

という意味で要するにこのやりとり (フィボナッチ関数を実装) 以降の変更がすべて破棄されますがいいですか? という確認です。

CleanShot20250621104529@2x.jpg

Continue and revert をクリックするか Enter キーを押してください。すると、fibonacci 関数が消えて、 fizzBuzz 関数が実装されました。 これも Accept で全て受け入れておきます。

この状態で変更を破棄をクリックするとどうなるでしょうか

CleanShot20250621104957@2x.jpg

変更を破棄すると、先ほどフィボナッチ関数をステージしましたのでそこまで戻ることができます。

CleanShot20250621105240@2x.jpg

こうすることで AI が行った提案を受け入れたり元に戻したりが柔軟になります。

が正直なことを言うと、あまりぐちゃぐちゃこのような操作をしなければならないというのは、AI に対するプロンプトに問題がある可能性があります。

こういう複雑な状況に陥ったら一度立ち止まって状況を整理してプロンプトの投げ方を見直してみる。その上で新たにスレッドを立てて AI エージェントに依頼する。という風にした方が良いかもしれません。が、引き出しの一つとしてこのような方法もあると覚えておくのは有益なことです。

拡張機能 Git Graph のインストール

最後に、Git をより便利に扱うための拡張機能である Git Graph をインストールしておきましょう。

CleanShot20250709103629@2x.jpg

Git では新しい機能を追加するときに、ブランチという機能を使って開発することがあります。ブランチでは開発や修正を安全に進めるために、メインの履歴とは別の「枝」を作り、自由に作業できる仕組みです。

ブランチのイメージ

  • 木の枝分かれのように、1 本の幹(main や master ブランチ)から新しい枝(ブランチ)を生やすイメージです。
  • 各ブランチは独立して作業でき、他のブランチに影響を与えません。

ブランチの主な用途

  • 新機能の開発:main ブランチとは別に feature ブランチを作り、安心して新しい機能を追加できます。
  • バグ修正:修正専用のブランチで作業し、問題が解決してから main ブランチに統合します。
  • 実験・テスト:本番コードを壊さずに、自由に試行錯誤できます。

ブランチはこのような機能があるのですが、それを視覚的にわかりやすくするための拡張機能が Git Graph です。下の図のように、どのタイミングでどのようなブランチに枝分かれし、どのタイミングで統合されているかといったようなことが視覚的に分かります。また、履歴をクリックすることで、その時の作業内容をエディターで確認できます。

]]>
Cursorの画面の見方と各機能の使い方https://python-engineer.co.jp/cursor-screen-configuration/Tue, 17 Jun 2025 06:44:24 +0000https://python-engineer.co.jp/?p=1234

目次 Cursor を構成する 6 つのパーツ ① Activity Bar ② Primary Side Bar ファイル・ディレクトリ構成の閲覧・編集 複数ファイルに跨がる文字列検索・置換 バージョン管理システム G ... ]]>

Cursor を構成する 6 つのパーツ

Cursor (VSCode) の画面は大きく分けると 1~6 のパーツで構成されています。

CleanShot20250616174917@2x.jpg

  1. Activity Bar
  2. Primary Side Bar
  3. Editor Groups
  4. Panel
  5. Stabus Bar
  6. Secondary Side Bar

以下、それぞれのパーツについて解説します。

① Activity Bar

CleanShot20250617110850@2x.jpg

アクティビティバー。いろいろな機能にアクセスするためのアイコンが並んでいます。V を押すと隠れているアイコンが表示されます。

標準では以下のような機能にアクセスできます。

  1. ファイル・ディレクトリ構成の閲覧・編集
  2. 複数ファイルに跨がる文字列検索・置換
  3. バージョン管理システム Git
  4. プログラムの実行・デバッグ
  5. 拡張機能の管理
  6. 拡張機能でインストールした各機能にアクセス
    1~5 までは標準で使用できます。6 はインストールした拡張機能によっては表示されることがあります。1~5 の使い方は後述します。

先ほどの VSCode の図ではアクティビティバーは左に並んでいますが、Cursor のアクティビティバーはこれとは違い、初期設定では下図のように表示されます。

CleanShot20250616103551@2x.jpg

アクティビティバーが表示されない場合は下の図の①をクリックするかショートカットキー Ctrl+BCmd+B を押してください。

CleanShot20250616112150@2x.jpg

VSCode のように左に表示したい場合は以下を参照してください。

ここからは上で挙げた 1~5 の機能について解説します。

② Primary Side Bar

アクティビティバーに並ぶアイコンをクリックすると、プライマリーサイドバーでその機能が表示されます。

ファイル・ディレクトリ構成の閲覧・編集

CleanShot20250617062546@2x.jpg

Cursor (VSCode でも同様。これ以降に解説する機能もどちらでも使える) でファイル・ディレクトリ構成を閲覧するには、閲覧したい対象を ドラッグ&ドロップするか、上部メニューから「フォルダを開く」で開きます。(ディレクトリとはフォルダのことです)

CleanShot20250617061754@2x.jpg

ディレクトリをクリックすると開閉し、配下のファイルを確認できます。ファイルをクリックすると画面中央部の Editor Groups で開いて中身を確認できます。右クリックして削除したり名前を変えたりすることもできます。Explorer (Windows) や Finder (Mac) でキーボードを使ってファイル名を変えたり削除したりコピーしたりという時に使うショートカットキーでも同じように操作できます。

現在開いているフォルダに新しいファイルが追加されてもすぐに表示が更新されないことがあります。例えば、ターミナルからコマンドでファイルを追加したり、カーソル外部でフォルダにファイルを追加したりといった場合です。

しばらくすれば更新されますが、すぐに更新したい場合は、「エクスプローラーを最新表示する」アイコンをクリックしてください。

CleanShot20250617111537@2x.jpg

複数ファイルに跨がる文字列検索・置換

CleanShot20250617062650@2x.jpg

虫眼鏡アイコンで複数ファイルにまたがる文字列検索・置換ができます。現在開いているファイル内のみで検索したい場合はおなじみの Ctrl+F もしくは Cmd+F ショートカットキーで検索できます。置換したい場合は > をクリックして置換モードにします。

CleanShot20250617063035@2x.jpg

バージョン管理システム Git

CleanShot20250617063646@2x.jpg

PC, Mac に、Git がインストールされていれば使えます。Git とは文字列などの差分を管理するためのシステムで、差分を表示したり、ある時点に戻ったり、新たな機能を追加するときに枝分かれさせて別の領域で作業したり、といった開発に欠かせない機能を提供します。

Git の具体的なインストール方法や使い方はここでは割愛します。詳しくは以下を参考にしてください。

プログラムの実行・デバッグ

CleanShot20250617065602@2x.jpg

プログラムを実行したり、実行構成 (launch.json) を作成して、プラグロムをショートカットキーから呼び出せるようにしたり、実行中に一時停止して挙動や変数の値を確認したりできます。

実行とデバッグバーを出すためには下の図の ^ をクリックして「実行とデバッグ」を選択します。

CleanShot20250617064819@2x.jpg

作業用プロジェクトを作成する

この機能を確認するために、以下のように作業を進めてください。

  1. 任意の場所に「first_python」というフォルダを作成
  2. このフォルダをカーソルにドラッグ&ドロップ
  3. 新しいファイルをクリック
    Pasted image 20250617102041.png
  4. ファイルの名前を basic.py にする
    CleanShot20250617102107@2x.jpg
  5. basic.py ファイルが開かれるので以下のように入力する
a = 'apple'
print(a)
  1. Ctrl+S (Windows) / Cmd+S (Mac) を押して上書き保存する

現在開いているファイルのプログラムを実行する

まずは現在開いているファイルのプログラムを実行するには①実行とデバッグを押し次に表示される ② Python デバッガーを選択し、

CleanShot20250617064905@2x.jpg

その次に表示される Python ファイルを選択すると実行されます。

CleanShot20250617064934@2x.jpg

あるいは画面上部にある①再生アイコンをクリックしても現在開いているプログラムが実行されます。実行結果は②画面下部のターミナルに表示されます。

CleanShot20250617070305@2x.jpg

これで実行できますが、毎回マウスを操作してクリックしたりするのは便当です。次は実行構成を作成してショートカットキーですぐ実行できるように設定します。

実行構成を作成してショートカットキーで実行できるようにする

実行構成とは、どのようにプログラムを実行するかという構成ファイルのことです。Python プログラムを例にします。

実行構成を作るためには下図にある①「launch.json ファイルを作成します。」を選択し、②「Python Debugger」を選択、

CleanShot20250617065214@2x.jpg

続いて、「Python ファイル」を選択します。
CleanShot20250617065259@2x.jpg

すると、下図のように表示されますので、Esc キーを押してください。

CleanShot20250617095219@2x.jpg

② launch.json ファイルと中身が作られます。①の●はファイルが保存されていないことを表していますので、Ctrl+SCmd+S キーを押して保存してください。

CleanShot20250617065407@2x.jpg

上の図の設定は「今現在開いているファイルを実行する」という設定です。ちなみに "program": "${file}" が「今現在開いているファイルを実行」を表しています。

この実行構成は F5 キーで実行できます

今現在開いているファイルではなく特定のファイルを実行したいという場合は「構成の追加」を押し、「Python デバッガー」を選択し、先ほどと同じように次のダイアログで「Python ファイル」選択肢ます。

CleanShot20250617095851@2x.jpg

すると②のように Cursor の 「Tab キー」という機能により下図のように basic.py に書き換えるよう提案が表示されます。(AI による提案などで必ずしも表示されるわけではありません。表示されない場合は 18 行目同じ場所にカーソルを合わせてみてください。そうすると表示されることもあります。それでも表示されない場合は手動で同じように書き換えを試みると表示されるはずです。)

CleanShot20250617095353@2x.jpg

これは「次やりたいのはこれでしょ?」という AI による提案です。提案を受け入れる場合は、機能の名前と同じく Tab キーを押すと受け入れます。受け入れたくない場合は、Esc キーを押します。

受け入れた場合、さらに次のように表示されることがあります。これも「次はこの場所にカーソルを合わせたいんでしょ?」という提案です。 Tab キーを押して受け入れてみます。

CleanShot20250617095411@2x.jpg

すると次のように現在のファイルの部分を basic.py に書き換えるよう提案が表示されました。Tab キーを押して受け入れておきます。これも AI がやることなので必ずしも表示されるわけではありません。表示されない場合は先ほどと同じように手動でカーソルを合わせてみてください。提案が表示されるかもしれません。それでも提案が表示されない場合は手動で書き換え始めると提案が表示されるはずです。

CleanShot20250617095421@2x.jpg

これで launch.json には 2 つの実行構成が作られました。launch.json タブに●が表示されている場合は、上書き保存ショートカットキー (Ctrl+S/Cmd+S) を押して保存するのを忘れないようにしてください。

この実行構成は下図の v をクリックすると選択できます。

CleanShot20250617100802@2x.jpg

CleanShot20250617070819@2x.jpg

こうすることで常に F5 キーで指定したファイルを実行できるようになります。ちなみに、F5 キーではなく、下の図の再生アイコンでも実行できます。

CleanShot20250617070848@2x.jpg

F5 キーを押した時に現在開いているファイルを実行するようにしたい場合は、「Python デバッガー: 現在のファイル」を選んでください。

CleanShot20250617101310@2x.jpg

ブレークポイントを押してデバッグしてみる

実行構成を作ったのでせっかくなのでデバッガーの機能を使ってみましょう。その前に仮想環境を作っておきます。 仮想環境を作って実行することは、Python を実行する時の作法です。なぜそうなのかはここでは割愛します。ひとまず飲み込んで受け入れておいてください。

  1. 画面右下の「3.x.x.x」という文字をクリック (環境によって何が表示されるかは違います)
    CleanShot20250617104507@2x.jpg
  2. 「仮想環境の作成」を選択
    CleanShot20250617104536@2x.jpg
  3. 「Venv」 選択
    CleanShot20250617104612@2x.jpg
  4. 最も新しいバージョンを選択。
    CleanShot20250617104703@2x.jpg

① に「.venv」というフォルダが作成され②が「3.x.x(‘.venv’: venv)」になれば成功です。
CleanShot20250617104747@2x 1.jpg

続いて、ブレークポイントを設置します。 ブレークポイントとは、プログラム実行中に一時停止する場所を示すポイントのことです。 ブレークポイントを設置するには、設置したい場所にカーソルを移動させ F9 キーを押します。

3 行目の print(a) にカーソルを移動させて、F9 キーを押してください。続いて、F5 キーを押してプログラムを実行すると、この場所で一時停止します。

下の図の 3 行目で行全体が黄色背景になっていますが、ここで一時停止していることを表しています。また変数のところに a = 'apple' と書いてありますが、ここでも変数の中身を確認できます。

CleanShot20250617105416@2x.jpg

また、上の図の右上に「ステップインする (F11) 」などのアイコンが並んでいます。これは一時停止したところから 1 行ずつ実行したり、プログラムを途中で強制終了したりするためのアイコンです。いろいろ触って試してみてください。

さらにデバッグ中は①「式の追加」を押し変数名を入力すると、その変数の値の変化を追うことができます。

CleanShot20250617105706@2x.jpg

このようにプログラムの実行・デバッグでは開発に欠かせない実行とデバッグの機能を管理できます。

拡張機能の管理

CleanShot20250617110201@2x.jpg

拡張機能の管理では、インストール済みの拡張機能を表示したり、アンインストールしたり、マーケットプレイスで拡張機能を検索したりできます。

拡張機能でインストールした各機能にアクセス

インストールした拡張機能によっては、その拡張機能のアイコンがアクティブバーに表示されます。

CleanShot20250617110346@2x.jpg

③ Editor Groups

エディターグループはファイルの中身を編集するエディタのメイン画面です。アクティビティバーでファイルをクリックしたり、ドラッグ&ドロップしたりするとエディターグループに表示されます。

エディターグループが便利なのは表示できる内容が 1 つだけではない点です。開きたいファイルを開きたい位置にドラッグ&ドロップすると複数のレイアウトで閲覧出来ます。例えば下図のように右側にドラッグ&ドロップすると

CleanShot20250617141106@2x.jpg

以下のように並べて表示できますし、

CleanShot20250617141339@2x.jpg

下に並べることもできます。

CleanShot20250617141405@2x.jpg

ここでは同じファイルを開いていますが、別々のファイルをレイアウトすることもできます。ウィンドウの幅や高さも調整できます。

CleanShot20250617141726@2x.jpg

複数のファイルを自由自在にレイアウトして見比べながら編集するという風に便利に使えます。

④ Panel

CleanShot20250617142405@2x.jpg

ターミナルパネル

パネルは画面下部にあるエリアで、メインになる機能はターミナルです。ターミナルはコンピュータに指令を与えるためのコマンドの入力やプログラムの実行結果を表示させるために使います。

上の図の①が launch.json の実行構成を実行したときのコマンド、②が実行結果です。③のプラスボタンを押すと、複数ウィンドウでターミナルを開けます。④を押すとパネルを非表示にできます。もう一度パネルを表示したい場合は画面上部にあるパネルの切り替えアイコンをクリックします。もしくは、ショートカットキー Ctrl+J/Cmd+J でもパネルを開閉できます。

CleanShot20250617143114@2x.jpg

パネルの境界線にマウスカーソルを持って行って、幅や高さを変えることもできます。

問題パネル

CleanShot20250617143810@2x.jpg

問題パネルでは問題のあるコードが表示されます。上の図では、3 行目末尾の赤い波線が引かれた a という箇所に問題があると言っています。

Ctrl+K/Cmd+K

CleanShot20250617144208@2x.jpg

Ctrl+K/Cmd+K はターミナルで AI と対話するための機能です。主に①のようにコマンドの使い方を聞くときに使います。 ②で AI のモデルを選択できます。cursor-small のように無料で使えるモデルで十分かと思います。Enter キーもしくは③の↑をクリックすると、ターミナルにコマンドが入力されます。

「Quick Question」をクリックすると、ターミナルにコマンドを入力するのではなく、ここで対話できます。

CleanShot20250617144330@2x.jpg

Add to Chat

Cursor ではエラーが起きたときにターミナルでエラー箇所を選択すると下の図のように 「Add to Chat」 というボタンが現れます。これをクリックすると AI とのチャットにエラー情報を送れます。

CleanShot20250617143402@2x.jpg

続けて「エラーの原因は?」とか「エラーを直して」などと依頼すれば対応してくれるでしょう。

AI との対話は Agent と Ask があります。自動的にファイルを編集してほしいときは、Agent Mode、何か相談したり質問に答えてほしいだけという場合は Ask Mode にします。

⑤ Status Bar

CleanShot20250617145435@2x.jpg

ステータスバーは画面下部に表示されるエディタの設定やファイルの状態などを表す領域です。ステータスバーを右クリックするとどんな機能が使えるか一覧できます。チェックが入っているものが、ステータスバーに表示されるものです。

CleanShot20250617145544@2x.jpg

ステータスバーに表示される情報が多くなると全てを表示しきれなくなるので適宜調整するとよいでしょう。が、初心者のうちは、ステータスバーをあまり触ることもないかと思います。

初心者のうちよく触るのはブレークポイントを押してデバッグしてみるで触った、「選択した Python インタープリター」ぐらいじゃないかと。

⑥ Secondary Side Bar

CleanShot20250617150434@2x.jpg

セカンダリーサイドバーは主に AI とのチャットに使う領域です。

① でチャットに使うコンテキスト (文脈) を追加できます。ここをクリックして追加できますし、ドラッグ&ドロップで追加することもできます。画像もコンテキストにできます。

② で AI に対するリクエストを入力します。

③ で Agent モードか Ask モードかを選択します。

④ をクリックすると今までのスレッドを再び開きます。開いたスレッドでは、そこから再開することもできます。

CleanShot20250617152121@2x.jpg

⑤ 上の図の「claude-4-sonnet」と書いてある場所をクリックするとメニューが開きます。 どの AI モデルを使うかを自動で設定するときはここにチェックを入れます。公式ドキュメントによるとコンテキストやトロンプトによって最適なモデルが自動的に選ばれるそうですが、個人的には Anthropic の Claude を指定することが多いです。

⑥ 複雑、高度な処理を依頼するときは、MaxMode を使います。クレジットの消費が非常に激しいため、使いどころには注意してください。

⑦ ⑤の Auto にチェックが入っていない場合、使用するモデルを選択します。さらに下にスクローすると「Add Models」という項目があります。ここをクリックするとモデル選択時にどのモデルを表示させるか? を設定できます。

CleanShot20250617152648@2x.jpg

基本的には初期値のままでいいと思いますが、使いたいモデルがあればチェックを入れておきます。

CleanShot20250617152757@2x.jpg

]]>
Cursorのインストール方法・日本語化・Python拡張機能・外観の設定方法https://python-engineer.co.jp/curso-install/Mon, 16 Jun 2025 03:17:29 +0000https://python-engineer.co.jp/?p=1172

Cursor (カーソル) は Microsoft が開発している VSCode (ブイエスコード) から派生 (Fork) し、AI と深く連携した次世代開発環境です。 ここでは について解説します。 目次 Curso ... ]]>

Cursor (カーソル) は Microsoft が開発している VSCode (ブイエスコード) から派生 (Fork) し、AI と深く連携した次世代開発環境です。

ここでは

  • インストール
  • 初期設定
  • 日本語化
  • Python 拡張機能のインストール
  • お気に入りのテーマで気分を上げる
  • 外観を VSCode に寄せる方法

について解説します。

Cursor のインストール

Cursor のインストール方法は以下の通りです。画像は Windows のものですが、Mac でも同じようにインストールできます。

まずは https://www.cursor.com/ja にアクセスしてダウンロードボタンをクリックし、インストーラーをダウンロードします。画像は Windows のものですが、Mac でアクセスすると「ダウンロード MacOS」 という表示になります。
2025-06-04_08h43_09.jpg

ダウンロードしたら、インストーラーを実行します。 実行すると次のような画面になります。「同意する」を選択して「次へ」

2025-06-04_08h44_40.jpg

インストール先は初期値のまま次へ
2025-06-04_08h44_48.jpg

スタートメニューフォルダの設定も初期値のまま次へ
2025-06-04_08h44_56.jpg

追加タスクの選択も初期状態のまま次へ
2025-06-04_08h45_03.jpg

インストールボタンをクリックします。
2025-06-04_08h45_10.jpg

インストールが始まります。インストールが終わると以下の画面になるので、カーソルを実行するにチェックを入れて完了ボタンをクリックします。

2025-06-04_08h47_18.jpg

Cursor のアカウント登録と初期設定

起動するとアカウントサインイン画面が表示されます。アカウントがないとカーソルを使用できないため、これからアカウントを作りましょう。まずは「Sign Up」をクリックします。

2025-06-04_08h48_00.jpg

ブラウザが開いて、メールアドレス、もしくは、Google アカウントなどを選択する画面になります。場合によってはサインアップではなく「Sign in」と表示されるかもしれません。その場合は「Sign up」のリンクをクリック、登録を進めてください。

2025-06-04_08h48_31.jpg

アカウントの登録が終わると、デスクトップで開いているカーソルにログインするかというボタンが表示されますので、「Yes, Login」 ボタンをクリックしてください。

2025-06-04_08h51_28.jpg

デスクトップで開いているカーソルでは次のような表示になります。もし VS Code がインストールされている場合は、Import from VS Code をクリックすると、VS Code の設定をそっくり引き継げます。クリックしておきましょう。そうでない場合は、「Skip and continue」 をクリックします。

2025-06-04_08h52_30.jpg

次に表示されるのは、カーソルのテーマ (外観) を選択する画面です。好きなものを選んで「Continue」ボタンを押してください。

2025-06-04_08h52_43.jpg

次に表示される「Quick Start」画面は、カーソルの機能にアクセスするためのショートカットキーの設定です。これは初期値のままで構いませんので、VS Code が選択されていることを確認して、Continue ボタンをクリックします。

2025-06-04_08h52_58.jpg

次に表示される画面は、カーソルとデータを共有するかという設定です。以下のように書いてあります。

デフォルトでは、カーソルはコードから学習し、可能な限り最高のエクスペリエンスを得られるようにします。
1.あなたがコントロールしてください:設定 → プライバシーでいつでもオフにできます!Cursor を使い始めた最初の日は、データ共有もオフになります。
2.デフォルトの動作:1 日使用すると、Cursor はあなたのプロンプト、コードベース、編集履歴、およびその他の使用データを保存して学習し、製品を改善します。
詳細はプライバシーポリシーとセキュリティページをご覧ください。
カーソルが私のコードから学習するのは構わない(あるいは、設定→プライバシーでオフにする)。

データを共有するかどうかは、任意です。どちらかを選択して、Continue をクリックして次に進みます。

2025-06-04_08h53_04.jpg

次に表示される「Review Settings」では AI とチャットするときの応答を日本語にするかという設定と、ターミナルで Cursor コマンドを実行したときに Cursor を開くか、というものです。

「Language for Al」は「Japanese」を選択しておきましょう。「Open from Terminal」はインストールしなくても大丈夫です。Continue を押して次に進みます。

2025-06-04_08h53_33.jpg

Cursor の日本語化

ここまででようやくカーソルのインストールと初期設定が終わりました。最初に表示されるのは以下のような画面です。英語表記なのでまずは日本語表記にしましょう。

2025-06-04_08h53_44.jpg

アプリ上部にある View というタブの中の Extensions をクリックします。

2025-06-04_08h54_39.jpg

検索ウィンドウに 「Japanese」 と入力し、一番上に表示される拡張機能のインストールボタンをクリックします。

2025-06-04_08h54_58.jpg

インストールが完了すると画面左下に再起動を促すボタンが表示されますので、クリックし再起動してください。

2025-06-04_08h55_10.jpg

再起動すると、メニューなどが日本語表示されます。 あとは必要に応じて拡張機能をインストールして自分に必要な環境を整えていきましょう。

Python をインストールしたい場合は「表示」「拡張機能」をクリックし

CleanShot20250616103930@2x.jpg

検索ウィンドウに「python」と入力します。「ms-python」と書いてあるものをインストールします。これは拡張機能の作成者を表しています。ms はマイクロソフトのことです。

なお、拡張機能をインストールするときは、ごく稀に悪意のある拡張機能がマーケットプレイスに存在するので注意してください。どこを見ればよいかというと、下の図の③のインストール数や、その右隣の星の数を見ます。

インストール数の多寡が悪意の有無に直接関わるわけではありませんが、悪意があればがすぐに広まる世の中ですから、インストール数が多いほど安心と考えて良いと思います。

CleanShot20250616104905@2x.jpg

Python の話に戻ります。② の拡張機能をインストールすると Python に加えて Python Debugger と Pylance もインストールされます。これはワンセットなのでこれで OK です。もう一つ④の「autoDocstring」もインストールしておくと何かと便利ですからついでにインストールしておきましょう。これは関数やクラスの説明文を書くときに Python の規約に則って書きやすくするためのものです。

さらに「autopep8」と検索し、これもインストールしておきましょう。これは自動的に pep8 という Python のコーディング規約に則るように、Python ファイルを整形 (フォーマット) してくれます。

実際にドキュメントをフォーマットするには、エディターを右クリックして「ドキュメントのフォーマット」を選択します。右に表示されているショートカットキーでも実行できます。

Formatter を選択する画面が表示されたら、autopate8 を選択してください。

お気に入りのテーマで気分を上げて開発しよう

Cursor では最初に選択できるテーマ以外にも有志によるテーマが数多く利用できます。お気に入りのテーマが見つかれば気分よく開発できるようになりますよ。

拡張機能検索ウィンドウに「theme」と入力するといろいろなものが表示されます。クリックしてインストールしてみてください。

CleanShot20250616120736@2x.jpg

インストールしたテーマを適用するには「コマンドパレット」を表示して
CleanShot20250616120450@2x.jpg

① 「theme」と入力し、「配色テーマ」を選択し、

CleanShot20250616121105@2x.jpg

候補の中から好きなものを選びます。
CleanShot20250616121216@2x.jpg

外観の微調整

ここから先は外観をより VSCode に寄せていく設定です。これは完全に好みの問題ですが初心者のうちは設定しておいた方が迷いが少なくなってよいと思います。

Cursor の標準設定ではプロジェクトが開かれていたり、拡張機能の一覧が表示されていると下図の矢印の辺りに「アクティビティバー」が表示されます。

CleanShot20250616103551@2x.jpg

VSCode の初期値ではアクティビティバーは下図のように左側に並んでいます。これを再現してみます。

CleanShot20250616102935@2xのコピー.jpg

そのためには「ファイル」「ユーザー設定」「設定」をクリックするか、ショートカットキーを押して設定画面を開きます。

Windows であれば、Ctrl+,、Mac であれば、⌘+, を押します。

CleanShot20250616102935@2x.jpg

設定の検索ウィンドウに「activity」と入力し、アクティビティバーを「vertical」にします。再起動が促されるので再起動してください。

2025-06-04_09h01_12.jpg

再起動するとアクティビティバーが VSCode のように左に並ぶようになります。

なぜアクティビティバーを左側に表示させると良いかというとアクセスしたい機能にすぐにアクセスしやすいためです。また、不意に Ctrl+B⌘+B を押すとアクティビティバーが非表示になり、一瞬混乱してしまいます。

下図①を押してアクティビティバーを表示させるか、ショートカットキーで表示させればいいのですが、それを知らないと混乱してしまいますよね。ですから、左側に常にアクティビティバーが表示されておいた方が迷いが少ないというわけです。

ちなみに AI とのチャット画面を不意に非表示にしてしまった場合は②をクリックすればもう一度表示されます。もしくは Ctrl+I⌘+I をクリックしても OK です。

CleanShot20250616112150@2x.jpg

ショートカットキーなんていちいち覚えてられないよという場合は、アイコンの上にマウスカーソルを持っていってください。大体の場合、下の図のようにショートカットキーも同時に表示されますので、だんだん覚えていきましょう。

CleanShot20250616112635@2x.jpg

]]>
AI融合型エディタCursorとは?https://python-engineer.co.jp/what-cursor/Wed, 04 Jun 2025 00:58:14 +0000https://python-engineer.co.jp/?p=982

Cursor (カーソル) とはプログラミングするためのアプリケーション = 統合開発環境 (IDE = Integrated Development Environment) です。作成したプログラムをを実行することも ... ]]>

Cursor (カーソル) とはプログラミングするためのアプリケーション = 統合開発環境 (IDE = Integrated Development Environment) です。作成したプログラムをを実行することもできます。

Cursor 以外のよく使われる IDE には以下のようなものがあります。

名前読み方特徴開発元価格
VS Codeブイエスコード/ビジュアルスタジオコード拡張機能で環境を構築していくMicrosoft無料
PyCharmパイチャームPython に特化JetBrains無料/有料 (高機能版)
XcodeエックスコードiOS/macOS アプリ開発に必須Apple無料 (Mac 専用)

Cursor は VSCode を元に作られています。VSCode はオープンソース (ソースコードが公開されている) なのでそれを AI に特化するよう改造して Cursor が作られました。 VS Code を使っていた方であれば、見た目はほとんど一緒なので、違和感なく使い始められます。

従来の IDE との違いは AI を使って開発する前提で作られていることです。より具体的には、AI に対して指示を与えやすかったり、AI が開発中のプロジェクト全体を見渡して必要な箇所を推論してくれる、というような機能が深く統合されています。

そもそもなぜ IDE が必要なのか?

そもそもなぜ IDE が必要なのかというと、その方がプログラミングしやすいためです。プログラム自体はただのテキストファイルであり、メモ帳などを使っても開発できます、IDE にはメモ帳にはない機能が豊富に含まれています。

例えば、機能ごとに文字を色分けしたり、タイポ (キーの打ち間違い) や文法上の誤りがあったときに警告が表示されたり、変数や関数の文字を途中まで入力すると単語の続きを提案してくれたりします。

CleanShot20250604065034@2x.png

従来の IDE でもこのような機能はありましたが、AI が統合された Cursor ではより効率的にプログラミングすることができるようになっています。

例えば、開発中のプロジェクトに関する質問をすると、プロジェクト特有の文脈に基づいて回答してくれたり、ログイン機能を AI エージェントに依頼すると、ログイン画面から認証機能までを一気に実装してくれたりします。

元になっている VSCode について

Cursor の派生元である VSCode はの開発元は Microsoft です。無料で利用できます。基本的にはソースコードを編集するためのソフトウェアです。特定のプログラミング言語に特化しているわけではなく、拡張機能をインストールして自らの環境に合わせて整えていきます。

Python だけでなく JavaScript や HTML、変わり種としては Excel VBA の開発も行えます。テキストエディタであるためソフトウェア開発だけでなく文章作成・小説執筆する方もいます。これはバージョン管理や執筆を補助する拡張機能が豊富なため、また AI の登場により AI が読み取りやすい Markdown に注目が集まっているためです。

なぜ Cursor を学ぶのか

Cursor のように AI が統合された IDE や拡張機能で AI を使ってプログラミングできるもの他にも色々とあります。

名前種類
Github Copilot拡張機能 (VSCode 系)
Cline拡張機能 (VSCode 系)
WindsurfCursor のように VS Code から派生した AI 統合開発環境
Windsurf Plugin拡張機能 (他の IDE でも Windsurf の機能を使えるようにしたもの)
JetBrains AI AssistantJetBrains 系拡張機能

他にもまだまだ色々ありますが、先鞭を付けたのが Cursor であり利用者、情報量が多いのが Cursor です。

私自身は Cursor 以外にも Github Copilot に課金したり、 JetBrains 系 IDE である PyCharm の有償版を使っていたり、Windsurf にも課金したりして、複数の環境を使い分けたり比べたりして開発しています。一番初心者が使いやすいのは Cursor だと思います。

本音を言えば AI 統合機能以外の PyCharm の機能と使い心地にとても満足しておりこれをメインにしたいのですが、AI 統合機能では Cursor に軍配が上がります。そのため開発効率を重視して現在は Cursor を中心に据えています。

Cursor の料金体系

Cursor を使うためにはまず Cursor のアカウントを作成し、料金プランを選択する必要があります。

Pricing | Cursor – The AI Code Editor

CleanShot20250604070306@2x.png

無料から始められ、プロ機能を 2 週間お試しできますので、まずは無料から始めると良いでしょう。

  1. Cursor のダウンロードとインストール
    まずは公式サイトから Cursor をダウンロードし、インストールします。
  2. 初期設定
    インストール後、初期設定を行います。画面の指示に従って進めます。
  3. ブラウザでサインイン画面を開く
    初期設定が完了すると自動的にサインイン画面が開きます。ここでアカウントを作成するか、既存のアカウントでログインします。
  4. Cursor アプリケーション内でログイン
    最後に Cursor アプリケーション内で「Log in」を選択すればログインを完了です。
]]>
AIコードエディタCursorの主要機能を解説https://python-engineer.co.jp/cursor-function/Wed, 28 May 2025 05:10:41 +0000https://python-engineer.co.jp/?p=969

Cursor には従来の IDE(統合開発環境) にはない AI を使った機能がふんだんに盛り込まれています。大まかに以下の 4 つです。 「WEB アプリが爆速で出来た」といった声を SNS で聞くことも多い AI エ ... ]]>

Cursor には従来の IDE(統合開発環境) にはない AI を使った機能がふんだんに盛り込まれています。大まかに以下の 4 つです。

  • チャット (Agent モード)
  • チャット (Ask モード)
  • Tab キー
  • Inline Edit (⌘K) / Ctrl+K

「WEB アプリが爆速で出来た」といった声を SNS で聞くことも多い AI エージェントによるプログラミングですが、使い込んでいると見えてくる、理想と現実のギャップもあります。そんな事例も紹介しつつ、各機能で何ができるのか? を把握して最先端プログラミングへの一歩を踏み出しましょう。

チャット (Agent モード)

エージェント (代理) 機能は AI がプログラマーの指示に従って一連のタスクを自動で実行してくれます。エージェントモードを使うと、例えば「ログイン機能を実装してテストも通して」といった要求に対し、ファイル/フォルダの作成、コードの編集からコマンドの実行までを AI が自動で行います

CleanShot20250528055958@2x.png

「Add context」を押して対象のファイルを追加したり、画像を追加したりできます。その他ドラッグ&ドロップでこの領域に放り込んでもコンテキストを追加できます。

エージェントモード

エージェントモードでは、AI が与えられた高レベルの指示を完了するまで自動で作業を進めます。複数のファイルにまたがる変更やコンパイル・実行なども一括して行い、開発者は結果を評価し、受け入れるかどうか判断します。

後述するように、コマンドを実行する、などの各段階で開発者が確認できるようになっていたり、コード変更前に自動でバックアップを取ったりと、安全に配慮されています。

AI が生成したコードを受け入れるかどうか、編集箇所ごとに決められます。

CleanShot20250528060252@2x.png

ファイルごとに一気に受け入れる or 拒否したり、

CleanShot20250528061105@2x.png

あるいは、複数ファイルにまたがる変更を一気に受け入れる or 拒否する事も出来ます。

CleanShot20250528061159@2x.png

反対に、一度受け入れた提案でも指示を出した段階にさかのぼり、元に戻せるようになっています。

CleanShot20250528060804@2x.png

プログラミングにおける意味

エージェントモードは、開発者の「こうしてほしい」という要望を理解し、コード編集やビルド、テスト実行など必要な作業を AI がほとんど代行する機能です。まるで人間のアシスタントに「このバグを直しておいて」と頼むように、AI が具体的な手順を自律的に考え実行してくれます。

ただし、曖昧な指示よりも具体例な指示の方が精度が高いのは言うまでもありません。私はプログラマ不要論に少し懐疑的です。具体例な指示を出すにはそれなりに技術を理解していないと出せませんから。

AI エージェントの登場により、例えばログイン機能を自力で実装しきる必要はなくなるかもしれませんが、非エンジニアとコミュニケーションを取り、文章化されていない要件まで含めてプロジェクトを咀嚼し、技術全体を俯瞰してどの技術をどう組み合わせるか、どのように AI に指示を出すか、といったより抽象的・高度な能力が求められるようになっていくのではないでしょうか。

曖昧な例
「ログイン機能を実装してください」

# views.py
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
def login_view(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('home') return render(request, 'login.html')

問題点

  • CSRF トークンの扱いが明示されていない
  • フォームのエラーメッセージ表示や入力バリデーションが無い
  • URL 設定やテンプレート側の実装が不足

具体的な指示
「Django の AuthenticationForm を使い、CSRF 対策とフォームのバリデーションを含むログインビューを実装し、成功または失敗時はメッセージを表示してください」

# views.py
from django.shortcuts import render, redirect
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login
from django.contrib import messages
def login_view(request): if request.method == 'POST': form = AuthenticationForm(request, data=request.POST) if form.is_valid(): user = form.get_user() login(request, user) messages.success(request, 'ログインに成功しました。') return redirect('home') else: messages.error(request, 'ユーザー名またはパスワードが正しくありません。') else: form = AuthenticationForm(request) return render(request, 'login.html', {'form': form})

このような簡単な単一のスクリプトを作るくらいなら AI だけに任せても出来てしまうことも増えてきました。しかし、商業で必要になるプログラミングの成果物は、多数のモジュールに渡って機能が連携した膨大なファイルから成り立っているのが普通です。現在の AI はまだそこまで包括的にプロジェクトの面倒を見られません。

実体験として、我々のようなエンジニアがどこかで介入しないと一見上手く行くように見えますが、どこかにバグが潜んでいます。私は AI によってエンジニアが不要になる、という見方はまだまだ先の話ではないかと思います。AI という革新的なツールをいかにに使いこなすか? がこれから求められるようになります。Cursor などの AI 統合開発環境はその筆頭格でしょう。

従来のプログラミングとの違い

従来はプログラマー自らが「コードの修正→保存→ビルド→テスト→エラー対応…」という一連の手順を何度も繰り返していました。エージェントモードでは、この手順を AI がまとめて行うため、人間は指示を出して結果を評価するだけで済みます。これにより開発速度が大幅に向上します。また、途中経過も逐一表示されるので、自動化されていても何が起きているか把握できる点も安心です。

与えた指示が終わったら通知音を鳴らすように設定しておけば AI に仕事を任せている間、ずっと画面を見守る必要はありません。この時間を使って別の仕事をしたり、メールチェックしたり、Youtube を楽しんだりできます。

CleanShot20250525115005@2x.png

具体例

例えば「ログイン機能を実装して、その部分のユニットテストも作成してください」とエージェントに依頼すると、AI はまずログイン機能のコードを書き、次に必要ならデータベース設定や関連ファイルも編集します。ユニットテストとは、コード、プログラムが期待した動きになるかどうか、確認するためのプログラムです。(先述のように具体的な指示の方が精度が高いのですが、簡略化のためあまり曖昧な指示になっています。これ以降の事例も同様です)

# app/auth.py
from flask import Flask, request, jsonify
from werkzeug.security import check_password_hash
app = Flask(__name__)
@app.route('/login', methods=['POST'])
def login(): data = request.json # 仮ユーザー情報 user = {'username': 'alice', 'password_hash': 'pbkdf2:sha256:...'} if data['username'] == user['username'] \ and check_password_hash(user['password_hash'], data['password']): return jsonify({'status': 'success'}), 200 return jsonify({'status': 'failure'}), 401

その後、自動でテストコードを生成し、プロジェクトのテストコマンドを実行します。仮にテストでエラーが出れば、原因を分析してコードを修正し、再度テストを実行…という流れを人手を介さず繰り返し、最終的にテストが通るところまで完了してくれます。ただし処理するべきコードの量が多いと処理漏れが発生することがありますので、よく注意して評価しなければなりません。まあ、人間に頼んだ時も同じことが言えるのですが。

import pytest
from app.auth import app
@pytest.fixture
def client(): return app.test_client()
def test_login_success(client): response = client.post('/login', json={ 'username': 'alice', 'password': 'correct_password' }) assert response.status_code == 200 assert response.json['status'] == 'success'
def test_login_failure(client): response = client.post('/login', json={ 'username': 'alice', 'password': 'wrong_password' }) assert response.status_code == 401 assert response.json['status'] == 'failure'

コンテキスト (文脈) の自動取得

エージェントが作業を行う際に必要となる周辺情報を自動で集めてくれる機能です。エディタ内でのカーソルの位置、プロジェクト内の関連するコードや設定ファイル、エラーメッセージ、コードの変更履歴などを AI が自律的に検索し、今のタスクに役立つ情報をモデルに提供します。開発者が逐一「このファイルも見て」と指示しなくても、AI が賢くコードベース (プログラムの全体) を理解してくれます。

プログラミングにおける意味

プログラミングにおいて「コンテキスト」とは、ある処理や問題に関連する周辺情報(コードや設定、利用しているライブラリの情報など)のことです。コンテキストの自動取得機能により、AI は今取り組んでいる課題に必要な他のファイルの内容や定義を自動で読み込みます。つまり、人間の開発者が「あのクラスの実装はどうなっていたかな?」と調べる代わりに、AI が自分で必要な部分を把握してくれるイメージです。

従来のプログラミングとの違い

ChatGPT や Gemini の Web アプリでも AI によるコード生成はできますが、カーソルと違って、逐一コンテキストを渡す必要があります。Cursor では、自律的に文脈を理解します。人間が指示する場合も、エディターと統合されているので、指示出しが簡単です。

CleanShot20250528064315@2x.png

Cursor ではコンテキスト取得が自動化されているため、その手間が省けます。AI がコードベース全体を見渡し「これが関係しそうだ」と判断した部分を推測して参照するので、人間が文脈を補足しなくても適切な回答やコード生成が得られる点が従来と大きく異なります。しかし、人間が明示的に指示してやった方が精度が高くなります

明示的に指示を出すには @ Add context を押して対象を選択します。

CleanShot20250528100913@2x.png

あるいはテキスト入力エリアに @ を入力します。 @ の前に文字が入力されていると機能しないのでその場合は半角スペースを入れてから @ を入力します。

CleanShot20250528073729@2x.png

具体例

例えば現在編集中のコードでエラーが発生したとします。その原因が別ファイルの関数にある場合、Cursor のエージェントはその別ファイルを読み込み、問題の関数の実装を確認します。そしてエラーの原因を突き止めた上でコードを自動修正します。開発者は自分でプロジェクト全体を検索することなく、AI が自律的に調査・修正してくれます。

コマンドの実行

Cursor のエージェントが必要に応じてターミナルコマンド(シェルコマンド)を自動生成・実行してくれる機能です。ターミナルとはいわゆる「黒い画面」で、文字だけでコンピュータに指令を出すことです。映画でもハッカーがそんなことをしているシーンがしばしば登場します。

CleanShot20250526064226@2x.png

ターミナルコマンドの例として「プロジェクトをビルドして」と AI に頼むと、AI は npm run buildmake など適切なコマンドを自動で端末に入力し実行します。デフォルトでは実行前に確認を求める仕組みになっており、ユーザーの許可無しに勝手にコマンドが走らないよう安全面も考慮されています。

なぜ事前に確認を求めるというと、コマンドの中にはファイルやフォルダを削除したり、データベースの構造を変えたりするような後戻りできないものがあるためです。

プログラミングにおける意味

開発ではコードを書くだけでなく、ビルドやテスト、ライブラリのインストールなど様々なコマンド操作が伴います。コマンド実行機能により、AI がプログラマの代わりにこれらの操作も自動化します。例えば AI がコードを書いた後、「このコードをテストするために pytest を実行しよう」と自分で判断し実行提案でしてくれるのです。

CleanShot20250528102100@2x.png

コマンド実行は初期設定では自動実行せず、ユーザーが実行ボタンをクリックして初めて実行されます。自動実行させたい場合は、設定画面から行います。

従来のプログラミングとの違い

通常、コードを書いた後にビルドやテストを行う際は開発者自身がターミナルを開いてコマンドを入力します。またコマンドのオプションや正確な名前を覚えていなければなりません。一言一句正確でないとエラーが発生します。私も以前はよくググって (もう死語ですかね) いました。今ではその必要はほとんどありません。

なぜなら Cursor では AI が望ましいコマンドを推測し、自動で実行提案まで行います。従来手動で行っていた環境構築やビルド・実行の作業をスムーズに代行してくれる点が大きな違いです。先述のように破壊的変更の危険があるため、実行前に確認ダイアログが表示される仕様になっています。

具体例

例えば、新しくパッケージを追加するコードを書いた場合、通常は自分で「npm install 新しいパッケージ名」とコマンドを実行するでしょう。Cursor のエージェントを使えば、コードに新しい依存関係を書き加えた際に AI がそれを検知し、自動で「依存関係をインストールしますか?」と提案してくれます。承認すれば AI が端末で npm install を実行し、続けて「ではアプリをビルドしましょうか?」と npm run build を提案してくれる、といった具合に対話的に進行します。

エラーの繰り返し修正

Cursor が Lint エラー (コードの文法ミスやスタイル違反のこと) や実行時エラーなどを検知すると自動的にコードを修正し、再度実行することを繰り返す機能です。

プログラムがエラー無く動作するまで AI が何度でも修正を試みてくれるため、開発者の手作業によるデバッグ回数を減らすことができます。

プログラミングにおける意味

コードを書いて実行した際にエラーが出るのは日常茶飯事ですが、この機能により AI がエラー内容を解析し、原因を取り除く修正を提案・適用してくれるようになります。Lint エラーについても、自動で修正してくれるため、コーディング標準に沿った綺麗なコードを保ちやすくなります。

従来のプログラミングとの違い

従来はエラーが発生する度にエラーメッセージを読み、該当箇所のコードを人間が修正して再実行するという繰り返しが必要でした。Cursor ではそのループを AI が行います。エラーメッセージを受け取った AI が即座にコードのどこが悪いかを特定し、修正するため、人間は提案を確認して受け入れるだけで済みます。開発者自身がデバッグサイクルを何度も回す必要がない点が革新的です。デバッグとはバグの発生箇所を調査し、バグを取り除くことです。

以前はエラーが出るとググっていくつものサイトを巡回し、自分のケースに当てはまるものを探し出し、自力でエラーを解決するというのが当たり前でした。しかし、AI の登場によって、この一連の作業は劇的に楽になりました。

具体例

例えば、Python では、if 文の次の行はインデントしなければならないなどの決まりがあります。これを守っていないと Lint エラーになりますが、それを自動で認識し修正を行ってくれます。

また、プログラム実行時にエラーが発生するとターミナルにエラーメッセージが表示されますが、そのエラーをチャットにコンテキストとして渡すこともできます。エージェントはエラー解決のためのコードの修正やコマンドを実行します。再実行してエラーになったら、またデバッグを行い、エラーがなくなるまで繰り返す、というサイクルを行ってくれます。

CleanShot20250526112935@2x.png

しばしばこのデバッグサイクルが同じところをぐるぐると回ってしまい、いわゆる無限ループに陥ることがあります。ツールの呼び出しが 25 回までに制限されているため、修正箇所が多いとツール使用回数に達して途中でエージェントの動きが止まってしまいます。(Max モードではツール呼び出しは 200 回まで)

ツールとは Cursor が活動するために使う各種機能で以下のようなものがあります。

ファイルを読む

  • コードベース内のファイルの内容を読みます。
  • 最大モードで最大 750 行
  • 他のモードでは最大 250 行

ディレクトリをリストする

  • ファイルの内容を読み取らずに、ディレクトリの構造を読み取る。

コードベース

  • インデックス付きコードベース内でセマンティック検索を実行します。

グレップ

  • ファイル内の正確なキーワードやパターンを検索します。

ファイルを検索する

  • 曖昧検索を使用して、名前でファイルをすばやく見つけます。

ウェブ

  • 検索クエリを生成し、Web 検索を実行します。

ルールを取得

  • ルールの種類と説明に基づいて特定のルールを取得します。
  • ルールとは Cursor 全体あるいはプロジェクト に対する指示です

これを執筆している段階では、まだまだ AI エージェントに全てを任せることはできません。人間がハンドルを握って、修正箇所を小さなものに限定するように指示したり、具体的な修正内容を指示するといった配慮が必要な場面は少なくありません。

画像を使用

チャットに画像をドラッグ&ドロップしたり、入力欄下の画像アイコンをクリックして画像ファイルを添付することで、AI に視覚情報を与えられる機能です。Cursor は画像内の文字を読み取ったり(OCR)、内容を解析してテキスト化し、AI への追加コンテキストとして利用します。後述の Ask モードでも使用できます。

プログラミングにおける意味

プログラミング中に直接関係する画像情報(例:スクリーンショットに写ったエラーメッセージや設計図)を AI に共有し、視覚的なデータも含めて支援を受けられるます。AI に、画像から得た情報まで加味させることで、言葉では説明しにくい、あるいは面倒な場合でも、回答やサポートが期待できます。

従来のプログラミングとの違い

従来はエラー画面のスクリーンショットを見ながら自分で文字起こししたり、UI デザインの画像を見比べながら手動で実装していました。Cursor では画像を直接 AI に渡せるため、画像中の情報を AI が理解しコーディング支援してくれます。

具体例

完成イメージの UI (ユーザーインターフェース) 画像を渡し「このデザインを HTML/CSS で実装して」と指示すれば、画像を解析して大まかなレイアウトを推測し、「まずヘッダー部分に○○、CSS で△△…」と実装してくれます。

余談ですが、デザインを実装する場合、より確実に期待する UI を実装するには MCP を使って Figma などと連携するとよいです。

ドキュメントを活用

外部ライブラリやフレームワークの公式ドキュメントを AI が参照できるようにする機能です。Cursor には主要なサードパーティ製ライブラリのドキュメントがあらかじめクロール・インデックス化されており、チャットで @docs と入力した後にライブラリ名を入力するだけでそのライブラリのドキュメント情報を AI に参照させることができます。

もし未登録のドキュメントが必要な場合でも、@Docs → “Add new doc” という操作で任意のドキュメントを追加し、AI に学習させることも可能です。これらの後述の Ask モードでも使用できます。

CleanShot20250528114056@2x.png

プログラミングにおける意味

これはAI に公式リファレンスを直接参照させることで、正確で信頼性の高い回答やコード補助を得るという意味があります。プログラミングでは公式ドキュメントの内容が重要ですが、人間が都度読みに行くのは大変です。

Cursor では AI が必要箇所をドキュメントから拾ってきてくれるため、常に最新かつ正確な情報に基づいたサポートを受けられます。が、過度な期待は禁物です。結局、自分でドキュメントを読んで実装した方が正確に実装できることも少なくありません。

従来のプログラミングとの違い

従来、コードを書いていて分からないことがあれば公式ドキュメントサイトを開いて検索する必要がありました。また、一般的な AI チャットは訓練データに古い情報しか無かったり不正確な知識を返すこともあります。Cursor のドキュメント活用機能では、AI が公式情報源をその場で参照するため回答の信頼性が上がります。開発者はエディタを離れずに必要なドキュメント知識を得られるという点でとても便利です。

具体例

実装済みの Python モジュール (ファイル) に対して @docs に続いて langchain でドキュメントを指定し、リファクタリングを依頼するという使い方ができます。

CleanShot20250528114857@2x.png

チャット (Ask モード)

Cursor の Ask モードはエディタ内で AI と対話しながらコードの相談や質問ができる機能で、常に現在開いているファイルやカーソル位置の情報を把握した上で回答や提案を行ってくれます。

エージェントとの違いは、エージェントはコードの編集やコマンドの実行を自動で行うのに対して、チャットでは編集や実行は行わずに質問に回答するという違いがあります。

CleanShot20250528104039@2x.png

画面を切り替えることなく、その場で「このコードにバグはないかな?」「どういう方針で実装したらいいかな?」などと質問すれば、AI がコンテキストを理解した上で答えてくれます。また、必要に応じて特定のコード部分やプロジェクト全体をコンテキストとして会話に含めることも可能です。プログラミング初心者や未経験者にとって非常に頼りになる教師のような存在です。

ブラウザで実行する ChatGPT のような WEB アプリとの違いは、ブラウザにプロジェクトのファイル群をアップロードする必要がないという点です。これはかなり楽です。

コンテキストを理解させる必要がない単純な質問の場合、Web 版の ChatGTP などに聞くのも一つの手です。なぜなら、Cursor は使用回数に制限があるためです。無料プランであれば月 50 回の低速リクエスト、プロプランの場合は月 500 回の高速リクエストという制限があります。

チャット

エディタ右側のチャットペインでは、人間が質問や指示を入力し、AI がそれに回答する形で対話が進みます。AI はバックエンドで高度な言語モデルを利用しており、エディタと連携して現在のコード内容を参照できます。これにより「この関数は何をしていますか?」のようなコードに踏み込んだ質問にも、AI が実際のコードを読み解いた上で答えてくれます。

プログラミングにおける意味

プログラミング中に疑問が生じたとき、チャット機能はまるでそばにいる先輩エンジニアに質問するような役割を果たします。AI がコードの文脈を理解して回答してくれるため、ドキュメントをいちいち検索したり、エラー内容をネットで調べたりする手間をその場で解消できます。チャットは常に現在のファイルや選択中のコードを把握しているので、「この部分、バグってないかな?」と聞けば AI が実際にコードを検証して助言してくれるわけです。

従来のプログラミングとの違い

従来、コードに関する質問をするには自分で調べるか、同僚に聞くか、あるいは汎用の ChatGPT などにコード断片を貼り付けて相談する必要がありました。Cursor のチャットではエディタと AI が統合されているため、画面を切り替えずシームレスに質問と回答が可能です。さらにコード内容を AI が直接参照できるため、誤解の少ない的確な回答が得やすいです。これは AI アシスタントや Web 検索にはなかった強みです。

具体例

例えばコードを書いていてエラーの原因が分からないとき、エラーメッセージの内容や該当コードをコピーしてウェブ検索する代わりに、Cursor のチャットに「このエラーは何が原因ですか?」と尋ねます。すると AI はエラーメッセージとコードを照らし合わせ、「◯◯の型が一致していないことが原因です。この変数を String 型に変換してから渡す必要があります」といった具体的なアドバイスを即座に返してくれます。また、新機能の実装方針に迷ったとき「ユーザー認証機能はどう組めばいい?」とチャットで相談すれば、コード例付きで実現方法を教えてくれるでしょう。

インスタント適用

インスタント適用は、チャット内で AI が提案したコードをワンクリックで実際のコードベースに反映できる機能です。AI から回答としてコードブロックが提示された際に、そのコードブロックの上部に表示される Apply ボタン(▶)をクリックするだけで、提案されたコードが該当ファイルに自動挿入・置換されます。

CleanShot20250528111142@2x.png

プログラミングにおける意味

AI との対話で得られたコード提案を手作業で自分のファイルにコピペする必要がなく、回答をすぐ自分のプロジェクトに取り込めるという意味で手間が省けて快適です。提案内容を確認して問題なければ即座に適用できるため、AI を活用した開発フローがスムーズになります。

従来のプログラミングとの違い

従来、たとえば ChatGPT など外部の AI から得たコード例を使うには、自分でエディタに切り替えてコピー&ペーストし、必要に応じて書式を整えるといった手間が発生していました。Cursor ではチャットとエディタが統合されており、ワンクリックで回答内容を反映できるのでそのような手間がありません。コピペミスも防げます。

具体例

例えばチャットで「この JSON 文字列をパースしてオブジェクトに変換するコードを書いて」と依頼した場合、AI が提案として何行かのコードを返してくれるでしょう。そのコードブロック上に表示される ▶ ボタンをクリックすると、Cursor は自動的に現在開いているファイル(または該当すべきファイル)にそのコードを書き込みます。結果、提案された関数を自分で写すことなくすぐに使い始めることができます。また、既存コードの修正提案であれば、対応する箇所が自動で書き換わります。

ウェブに問い合わせ

チャット内で @Web コマンドを使うことで AI にインターネット検索をさせ、最新の情報を取得できる機能です。プログラミングの疑問点によっては手元のコードだけでなく最新の技術情報や一般的な知識が必要なことがありますが、この機能により Cursor は Web 上から適切な資料を見つけて回答に反映します。エージェントモードの場合は必要に応じて自動的に Web を検索することもありますし、明示的に @web を使うことも出来ます。

プログラミングにおける意味

最新ライブラリやフレームワークの利用方法を調べたり、API 仕様やエラー解決策の最新情報を取得できます。AI が知らない直近の出来事についても調べられるため、常に最新の技術トレンドに対応できます。

従来のプログラミングとの違い

通常、開発中に最新情報を知りたい場合は自分でブラウザを開いて検索しなければなりませんでした。Cursor ではチャット内で「@Web React 最新のフックの使い方」などと入力するだけで、AI が自動でウェブ検索し結果を要約してくれる点が大きく異なります。これは従来のコードエディタには無い、仕組みです。また AI 単体では持っていない知識でも、この方法で補えるため回答の正確性・網羅性も向上します。

CleanShot20250528113743@2x.png

具体例

例えば「このエラーコードの意味は?」と聞いて AI が知らない場合でも、「@Web」で検索させれば該当エラーに関する最新の StackOverflow 回答や公式ドキュメントを見つけ出し、「エラーコード 1234 は○○を意味し、設定ファイルの△△を変更する必要があると記載があります」と答えてくれることがあります。また、新しいライブラリの使い方が分からないとき「@Web ライブラリ XYZ 使い方」と入力すれば、AI が Web 上のチュートリアル記事等を調べ、「公式サイトによると XYZ の使い方は…」と要点を教えてくれるのです。

Tab キー

Tab キーは Cursor のオートコンプリート(自動補完)機能の名前です。提案を受け入れる場合は Tab キーを押すことからこんな名前なのでしょう。キーボードの Tab キーのことをいっているのか、Cursor の Tab キーのことをいっているのか区別しにくくなってしまい紛らわしいのですが。Tab キーを押して提案を受け入れるだけで、面倒なコードを書く手間が大幅に省けます。

マルチライン編集

Cursor のオートコンプリートは従来の IDE 補完よりも強力で、現在の文脈から次に書くべきコードを複数行まとめて予測・提案してくれます。

CleanShot20250528115450@2x.png

開発途中の文脈や直前の編集内容も考慮して提案を更新してくれます。ときどき「俺の脳内スキャンしてる?」という感覚になるほど賢いです。反面そこを変えたらだめだろ、というような提案もあります。依存しすぎは事故の元です。もし余計な提案が現れたら Esc キーを押してキャンセルできます。

プログラミングにおける意味

オートコンプリートは本来、プログラミング中に変数名や関数名の入力を補助する機能ですが、Cursor の場合は AI が現在のコードやコメントを理解し、次に必要な処理そのものを予測して提示してくれる点が特徴です。つまり、自分が書こうとしていたロジックを AI が先読みして書いてくれるので、まさにペアプログラミングで相棒が続きを書いてくれるような役割を果たします。

従来のプログラミングとの違い

従来の簡易なコード補完機能では、例えば関数名の途中まで入力すると残りを補完するといった単純な提案が主でした。また IDE によっては一行程度のスニペット提案はありますが、Cursor のように複数行にわたり現在の文脈に合わせた高度な予測を行う補完はありませんでした。従来は開発者自身が考えてコードを書き進める必要があった部分を、Cursor では AI が先回りして提案してくれるため、コーディングの効率と快適さが格段に異なります。

具体例

例えば「ユーザーのリストを名前順にソートする」という関数を書こうとコメントを書いたとします。Cursor はコメント内容から意図を汲み取り、次の瞬間にはその関数の中身(ソートアルゴリズムやループ処理など)を数行にわたって提案してくれます。

# ユーザーのリストを名前順にソートする関数

AI が続きを書いてくれます。

# ユーザーのリストを名前順にソートする関数
def sort_users_by_name(users: list[dict]) -> list[dict]: """ users: {'name': str, 'age': int} の辞書のリスト 戻り値: 名前順にソートされたリスト """ return sorted(users, key=lambda u: u['name'])

こんなことができるのは LLM が「続きを書くことが得意」という性質があるためです。

開発者は Tab キーを押すだけでその提案を受け入れ、一瞬で関数の骨組みが完成します。また、変数名を入力し始めると、それに合致する既存の変数や型に応じた初期値まで含めたコードを続けて提示してくれることもあります。

下記のカーソル予測と連携して機能することも多々あり、とても便利です。

カーソル予測

Cursor が次にユーザーが編集したい箇所を予測し、自動でカーソルを適切な位置に移動させる機能です。これにより、コーディング中のカーソル移動がスムーズになります。カーソルを移動した先で先述のマルチライン編集が表示されることもあります。

カーソル予測による補完が現れなくても、編集したい箇所にカーソルを持っていくとコードを提案してくれることもあります。

なかなか賢いです。

プログラミングにおける意味

コードを書く際、開発者は頻繁にキーボードやマウスでカーソル位置を移動させます。カーソル予測機能は AI がおおよそ「次に編集したいであろう場所」を推測し、カーソルを移動させてくれるます。

従来のプログラミングとの違い

一般的なエディタでは、カーソルの移動は全てユーザーの操作(矢印キーやマウスクリック)に委ねられていました。Cursor のカーソル予測は、従来存在しなかったレベルでの入力支援です。しばしばお節介ですが、わりと適切に次の入力箇所へ導いてくれます。これは従来にない UX(ユーザー体験)で、些細な機能に思えますが長時間のコーディングでは効率に差が出ます。

具体例

例えば、関数を定義し終えた後、本来であれば自分でカーソルを移動して関数を呼び出すコードを書き始める必要がありますが、Cursor のカーソル予測機能が自動で適切な位置に移動してくれます。

従来

# ユーザーが入力した直後の状態(カーソルは関数定義内に残っている)
def greet_user(name): print(f"Hello, {name}") # カーソルがここに残っているとすると…
# ここで自分でカーソルを移動して次の処理を入力する必要がある

カーソル予測

# Cursor のカーソル予測が作動し、
# カーソルを自動で関数定義の外、次にコードを書き始めやすい位置に移動
def greet_user(name): print(f"Hello, {name}")
# ← カーソルがこの行頭に移動し、以下のような提案も表示
greet_user("Alice")

スマートリライト

スマートリライトは、開発者が途中まで入力した不完全なコードや、文法的に誤ったコードを AI が賢く解釈し正しい形に書き換えてくれる機能です。多少雑な入力でも、Cursor が意図を汲んで最適なコードにリライト(書き直し)してくれるため、コーディング初心者でも安心してコードを書くことができます。

プログラミングにおける意味

スマートリライトの意味するところは、AI がプログラマの書こうとしている内容を予測し、正しい構文やより良いコードに自動修正してくれることです。人間にとっての「書きかけのメモ」を、AI がきちんと清書してくれるようなイメージです。これにより、細かなシンタックスミスやうっかりミスを深く気にせずコーディングを続けられます。

従来のプログラミングとの違い

従来のコーディングでは、コードの一部を間違えると警告表示され、その都度自分で修正する必要がありました。高度な IDE でも簡単なタイポ (キーの打ち間違い) を直す程度の補助はありますが、Cursor のように意図を読み取ってコード全体をより良く書き換えてくれる機能はありませんでした。スマートリライトのおかげで、従来はエラー原因を調べて修正に費やしていた時間を削減できます。

具体例

例えば、プログラミング初心者が Python でリストをループするコードを書こうとして、コロンを忘れたり変数名を間違えたりしたとき、その場でコードをより正確な形に整えてくれるのです。

# 誤り: コロンが抜けている・変数名が間違っている
item_list = [0, 1, 2, 3, 4, 5]
for i in range(len(item_lst)) print(item_lst[i])

Cursor 提案後:

# 修正後: コロンを追加し、変数名を正しい item_list に統一
item_list = [0, 1, 2, 3, 4, 5]
for i in range(len(item_list)): print(item_list[i])

コロンの追加
元の for 文には末尾のコロン : が欠けていましたが、AI が検知して自動で補完。

変数名の統一
item_lst のスペルミスを見つけ、正しい item_list に置き換えています。

このように、Cursor のスマートリライトは構文エラーや単純なタイポをまとめて訂正し、即座に動作するコードに整えてくれます。また、余計な半角スペースを削除する提案をしたり、コーディング規約に則った提案もしてくれます。

⌘K / Ctrl+K

⌘K(Mac)、およびCtrl + K(Windows) は、エディタ内でショートカットによって呼び出せる AI コード補助機能です。⌘K は Cursor 独自のホットキーで、これを押すことで AI によるコードの生成や編集、ターミナルコマンド生成といった操作をコード編集中に即座に利用できます。Chat 機能が対話形式のサポートであるのに対し、⌘K 機能はより直接的にエディタやターミナルで AI 補助を得られます。

これは、エディタ内およびターミナルで利用できます。

インライン ⌘K

エディタ上で⌘K(Ctrl+K)を押すことで起動する、コードの生成・編集機能です。何も選択せずに⌘K を押すと、新しいコードを生成するプロンプトが表示され、そこで「○○な関数を作成して」と指示すると AI がコードを書き出します。一方、コードを選択した状態で⌘K を押すと「Edit」モードとなり、「このコードを△△のように変更して」と自然言語で伝えるだけで AI が選択部分を編集してくれます。カーソルの位置によって編集範囲を自動的に拡張してくれます。

CleanShot20250528121416@2x.png

右下の v をクリックすると、選択範囲に対する指示なのか (Edit Selection)、ファイル全体に対する指示なのか (Edit Full FIle) 選べます。
CleanShot20250528121544@2x.png

また、Quick Question はその場で回答を得られます。
CleanShot20250528121828@2x.png

Sent do Chat ではチャットペインにコードを送れます。

コマンドライン ⌘k /Ctrl+k

コマンドライン (ターミナル) でも使えます。ターミナルを選択して⌘K を押します。そのまま実行できるようにはなっていません。回答をコピペしてタミナルに貼り付けて実行します。
CleanShot20250528134732@2x.png

プログラミングにおける意味

⌘K によるコード生成・編集は、開発者が望むコード変更を直接文章で指示し、即座にその結果を得られることを意味します。新規コードの自動生成から既存コードのリファクタリングまで、煩雑な操作なしに実行できます。隣に有能なペアプログラマーがいて「ここはこう書き換えておきましたよ」と助けてくれるような感覚です。

従来のプログラミングとの違い

従来、コードを書き換えるには開発者自らが該当箇所を編集し、文法ミスがないか確認し、影響範囲も考慮して…というステップが必要でした。また、新しいコードを一から書くときも、手作業でタイピングしロジックを構築する必要があります。⌘K 機能では開発者の意図を一文で伝えるだけで AI が即座にコードを書き・書き換えてくれるため、このプロセスが大幅に短縮されます。例えば関数名の一括変更やアルゴリズムの差し替えもワンアクションで完了し、従来の何倍も迅速にコードベースを改良できます。

具体例

既存のコードで変数名 x があまり意味を持たないので、よりわかりやすい名前にしたいとします。その場合、該当コードを選択して⌘K を押し、「変数 x を適切な名前にリネームしてください」と入力します。すると AI がコード中の xuserCount に置き換え、必要なら関連する部分も整合性を保つよう編集してくれます。また、新しく日付をフォーマットする関数が欲しい時は、何も選択せず⌘K を押して「今日の日付を YYYY-MM-DD 形式の文字列で返す関数を実装して」と指示します。即座に AI がその関数のコードを生成し、エディタ上に挿入してくれます。

]]>
Python パッケージ管理ツール「uv」とは? – 爆速のライブラリ管理を初心者向けに解説https://python-engineer.co.jp/uv-env/Mon, 21 Apr 2025 07:57:20 +0000https://python-engineer.co.jp/?p=897

Python で開発を始めるとき、パッケージ管理や仮想環境という言葉を耳にすることが多くなります。特に最近注目されているのが、Rust 製の超高速パッケージ管理ツール「uv」です。この記事では、Python 初心者の方向 ... ]]>

Python で開発を始めるとき、パッケージ管理仮想環境という言葉を耳にすることが多くなります。特に最近注目されているのが、Rust 製の超高速パッケージ管理ツール「uv」です。この記事では、Python 初心者の方向けに「uv」とは何か、なぜ便利なのかをわかりやすく解説します。

uv の魅力

そもそもなぜ uv を使って仮想環境を管理するのが良いか、結論から先に述べておきます。

  • 従来のパッケージ管理システムであるpipと比べて圧倒的に早い
  • プロジェクト用のディレクトリを作って仮想環境を作成する、などの定型作業を簡略化できる

例えば yfinance ライブラリのインストールでは uv は約3秒、従来の pip は約 10秒と3倍以上の差が出ます。

↓ uv add を使った場合

↓ pip install を使った場合

普段pipを使ってパッケージ管理しているという方も、この機会にぜひuvを使った仮想環境管理を始めてみてください。

そもそも仮想環境って何? – プロジェクトごとの“部屋”を作ろう

uv の話に入る前に、初心者の方がつまずきやすい「仮想環境」について簡単に説明します。

Python の大きな魅力の一つに、サードパーティーライブラリが充実している、というものがあります。サードパーティーライブラリとは、Python インストール時に一緒にインストールされるライブラリとは別の、第三者が開発し公開しているライブラリのことです。例えば、requestspandasなどはサードパーティーライブラリの代表的な例です。

このサードパーティーライブラリを使う場合は、その都度インストールして使いますが、仮想環境を使わないでインストールすると問題が起きてしまいます。そのため、仮想環境を使ってサードパーティーライブラリをインストールするのが基本的な Python の作法です。

仮想環境とは、一言で言えば「プロジェクトごとに分離された専用の Python 環境」のことです。通常、Python で仮想環境を使わずにライブラリをインストールすると、システム全体(またはユーザー全体)で共有されます。しかしこの場合、別々のプロジェクト間でライブラリのバージョンがぶつかったり、不必要なものまで混ざってしまったりしてトラブルの元になります。

なぜなら、プロジェクト A ではrequestsのバージョン 1.0 にしなければならないが、プロジェクト B ではrequestsのバージョン 2.0 でなければならない、ということがあります。ところがシステム全体にインストールしたrequestsがバージョン 1.0 だとプロジェクト B では要件を満たさなくなり、エラーが出てしまいます。

いってみれば、複数のエンジニアが、1台のパソコンを取り合っているような状況です。

このような場合に仮想環境を使うと、プロジェクト A 用、プロジェクト B 用…といった具合にそれぞれ独立したライブラリの置き場を作れるのです。

例えて言うなら、仮想環境はプロジェクト専用の部屋(またはサンドボックス) です。各部屋にはそのプロジェクトに必要な道具(ライブラリ)だけが置いてあり、他の部屋の道具とは混ざりません。

仮想環境を使うことで、「他のプロジェクトで動いていたコードが急に動かなくなった…」といった依存関係の混乱(いわゆる“依存関係地獄”)を避けることができます。Python 開発において仮想環境は今や必須の知識ですので、uv を使わない場合でも是非覚えておきましょう。

uv の基本的な使い方 – インストールからプロジェクト作成まで

では本題のuv の使い方を見ていきます。ここでは Windows および Mac で Python 3.13 を使っていることを想定します。uv 自体のインストール方法から、プロジェクトでライブラリを追加する手順まで、順を追って解説します。

uv のインストール方法

uv は以下の方法でインストールできます。初心者の方には手軽な方法として、まず公式の一行インストールスクリプトを使う方法をおすすめします。

Windows の場合

PowerShell を管理者権限で起動して次のコマンドを実行します。

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

Mac の場合

ターミナルで次のコマンドを実行します(公式サイトが提供するスクリプトを実行する形です)。

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

brew を使う場合は以下のコマンドを実行します。

brew install uv

インストール成功の確認

インストール後にターミナルを再起動し、uv --versionuv helpを実行してみて、エラーが出なければ導入成功です。

uv -V
uv 0.6.14 (Homebrew 2025-04-09)

プロジェクトの初期化(uv init)と仮想環境の作成

uv をインストールできたら、早速プロジェクトで使ってみましょう。まず新しく Python プロジェクトを始める場合や、既存プロジェクトで uv 管理に切り替える場合は、プロジェクト用フォルダでuv initを実行します。

ここでは uv_testというディレクトリ(フォルダ)を作成し、作業を進めていきます。

mkdir uv_test
cd uv_test

続いて、uv initを実行することで、カレントディレクトリに以下のファイルが作成されます。

uv init

lsコマンドで確認してみてください。

Windows (PowerShell)

ls -Force

Mac

ls -la

作成されたファイル、フォルダ群

すると以下のファイルが作成されていることがわかります。先頭にドットが付いているものは隠しファイルや隠しディレクトリです。-Force-laは、隠しファイルも表示するようにするオプションです。

.git
.gitignore
.python-version
README.md
main.py
pyproject.toml
  • .git – Git リポジトリのディレクトリ(バージョン管理に用いる)。
  • .gitignore – Git で無視するファイルの設定。
  • .python-version – Python バージョン管理。
  • README.md – プロジェクトの説明文。
  • main.py – サンプルの Python コードで、プロジェクトが空の場合に雛形として用意されるものです。削除しても構いません。
  • pyproject.toml – プロジェクトの設定ファイル(後述)。

このように、uv initは複数のファイル・ディレクトリを一度に作成できます。冒頭で述べた「定型作業を簡略化」の一例です。

プロジェクト用ディレクトリまで一気に作成するコマンド

上述のように、プロジェクトフォルダ作成と init コマンドを別々に実行するのではなく、以下のようにすれば、プロジェクト用フォルダと上述のファイル・ディレクトリ群を同時に作成できます。

uv init <プロジェクト名>

uv initにより、仮想環境(.venv フォルダ)も自動で作成されるといわれていますが、本稿執筆時点の最新バージョン 0.6.14 では、仮想環境は手動で作成する必要があります。もっとも、後述するuv addを使えば、仮想環境も同時に作成できますので、以下のコマンドは実行する必要はありません。

uv venv <仮想環境名>

具体的には

uv venv .venv

とすると、次のような出力が表示されます(Mac の場合)。

Using CPython 3.13.2
Creating virtual environment at: .venv
Activate with: source .venv/bin/activate

続けて、Activate with: の後に書かれているコマンド(source .venv/bin/activate または .venv\Scripts\activate)で仮想環境を起動しましょう。

パッケージ(ライブラリ)の追加: uv add と uv sync

仮想環境の準備ができたので、次にライブラリを入れてみましょう。従来ならpip install ライブラリ名でインストールしていたところですが、uv では専用コマンドuv addを使います。例えば、プロジェクトに WEB フレームワークdjangoを入れたい場合

uv add django

と実行します。すると、uv は以下のような処理を自動で行います。

  • 適切な Python インタプリターで仮想環境(.venv)を作成(仮想環境がない場合)。
  • PyPI 上からdjangoおよびその依存ライブラリを解決し、必要なパッケージ一覧を決定。
  • パッケージのダウンロード・インストールを実行。

実行結果として、「X 個のパッケージを何ミリ秒で解決」「Y 個のパッケージを準備・インストール」などと表示され、例えばdjangoに加えてasgirefsqlparseなどの関連ライブラリも含め数秒以内で完了します。

uv add django
Using CPython 3.13.2
Creating virtual environment at: .venv
Resolved 5 packages in 4ms
Prepared 3 packages in 1.12s
Installed 3 packages in 59ms + asgiref==3.8.1 + django==5.2 + sqlparse==0.5.3

このとき従来の pip installのようにあらかじめ仮想環境を作成し、仮想環境に入っておく必要はありません。「仮想環境に入り忘れたままpip installを実行してしまい、システム全体にインストールしてしまった!」という初心者あるあるを避けられます。もちろん、あらかじめ仮想環境を作成・仮想環境に入った状態でuv addを実行しても構いません。

ただ、仮想環境にインストールしたライブラリを使ったプログラムを実行するには、仮想環境に入った状態でプログラムを実行する必要があります。後述のuv runコマンドを用いれば一時的に仮想環境を起動してプログラムを実行できます。

が、仮想環境が有効になるのはその一回限りなのでやはり .venv\Scripts\activate (Windows) もしくは source .venv/bin/activate (Mac) で常に仮想環境に入った状態にしておくのがおすすめです。

(補足)uv は初めてuv addを実行したタイミングで自動的にpyproject.tomlファイルにそのライブラリを追加し、依存関係をまとめたuv.lockファイルも生成・更新します。これらについては後述します。

その他の基本コマンド (remove, sync, lock, run, tree)

uv には他にも便利なコマンドが用意されています。主なものをまとめると次の通りです。

  • uv remove <ライブラリ名> – プロジェクトからライブラリを削除します。依存関係から外し、仮想環境からもアンインストールされます。
  • uv sync – プロジェクトの依存関係設定(pyproject.toml や lock ファイル)と仮想環境の内容を同期します。レポジトリをクローンしてプロジェクトを構築する際などに使用します。
  • uv lock – 依存関係のロックファイル(uv.lock)を生成・更新します。通常uv add時に自動実行されますが、明示的にロックだけ更新したい場合に使います。
  • uv run <コマンド> – 仮想環境上で指定したコマンドを実行します。例えばuv run pytestとすれば、そのプロジェクトの環境で pytest(テスト)を実行できます。uv run pythonとすれば仮想環境の Python で対話モードを起動でき、プログラムもその環境で動かせます。
  • uv tree – プロジェクトの依存関係ツリーを表示します。どのパッケージがどのパッケージに依存しているかを階層表示するコマンドで、環境の把握に役立ちます。

まずは以上のコマンドを覚えておけば、ひと通り uv での開発を進められるでしょう。pip で行っていた操作は、基本的にuv <サブコマンド>で代替できるイメージです。次は、従来の pip コマンドとの具体的な違いに触れてみます。

uv を使うとライブラリのインストールが速い理由

Python の標準的なパッケージ管理コマンドであるpipは便利ですが、大量のライブラリをインストールするときや、依存関係が多いライブラリのインストールに時間がかかりがちです。なぜなら、pip1 つずつ順番にパッケージをダウンロード・インストールするため、ネットワークの待ち時間や入出力処理が積み重なって数分かかってしまうこともあります。

そこで、uv は内部処理を大幅に高速化しています。その仕組みをいくつか紹介しましょう。

並列処理(パラレル)による速度向上

uv は複数のパッケージを同時にダウンロード・処理できます。イメージとしては、pip が 1 本の水道から順番に水をくむのに対し、uv は複数の水道から同時に水をくむようなものです。一度に複数の作業が進むため、全体の時間が短縮されます。

キャッシュ(Cache)の活用

uv は過去にダウンロードしたパッケージを保存して再利用します。例えば一度ライブラリをインストールすると、そのライブラリのデータを倉庫にとっておくイメージです。次回同じものが必要になったとき、倉庫からすぐ取り出せるので、再ダウンロードする必要がなく速いのです。また、uv はインストール済みのファイルをコピーせずにリンクで共有する仕組み(ハードリンクやコピーオンライト)も使っており、無駄なディスクコピーを減らして速度アップと容量節約を実現しています。

必要なデータだけ取得

pip はパッケージの情報を得る際に、パッケージ丸ごと(例えばホイールファイル)をダウンロードすることがあります。しかし uv は、ホイールファイル内の必要なメタデータ部分だけを取得するなど、「ムダなダウンロードを省く」工夫をしています。これは、分厚い本から必要なページだけコピーするようなもので、結果的に通信量と時間を節約できます。

Rust による高効率な実装

uv は Python ではなくC言語のようなシステムに近い言語であるRustで書かれているため、処理自体のオーバーヘッドが少なく最適化されています。そのため依存関係の解決(どのバージョンのライブラリを入れるか決める作業)やインストール処理が軽快に実行されます。

以上のような理由から、uv は pip に比べて桁違いに高速な動作を実現しています。公式によればpip の 10 ~ 100 倍速いケースもあるとのことです。

従来の pip install と何が違うの?

uv を使うときに気になるのが、「従来のpip installと何が違うのか」という点ですよね。ここでは処理方式や使い勝手の違いをもう少し詳しく見てみましょう。

pip コマンドとの互換性と違い

uv は「pip のドロップインリプレース(置き換え)」を目指して作られており、pip の主要な機能はほぼそのまま使える互換モードを持っています。例えば、以下のような pip コマンド相当の操作が uv でも可能です。

uv pip install <パッケージ名>

pip installと同様、パッケージをインストール。ただし仮想環境が存在しないとエラーになります

uv pip install -r requirements.txt

pip install -rと同様、requirements.txt の内容をまとめてインストール

uv pip uninstall <パッケージ名>

pip uninstallと同様、パッケージをアンインストール

uv pip list

インストール済みパッケージの一覧表示(pip listと同様)

uv pip freeze

インストール済みパッケージをpip freeze形式で表示

互換性の違い

このように、基本的な pip 操作は uv 経由でも同じように実行可能です。そのため、既存のプロジェクトに uv を導入しても、慣れ親しんだ pip コマンド感覚で操作できます(実際は内部で uv の速い処理が動いています)。

では一方で、uv 独自の違いとして何があるでしょうか?主なポイントは次の通りです。

  • 圧倒的な速度: すでに述べた通り、uv は pip に比べて数倍~数十倍の速度で依存関係の解決とインストールを行います。Rust 製実装の恩恵で公式ベンチマークでは最大 100 倍速いとされます。
  • 一部の挙動の違い: uv は pip との互換性を重視しつつも、依存関係の解決アルゴリズムが独自実装のため、場合によって pip と異なるバージョンのパッケージを選択することがあります。例えば、あるライブラリがまだ正式版でなくプレリリース版(ベータ版など)しかない場合、pip はそれを入れてしまうことがありますが、uv は極力安定版(ステーブル)を選ぶポリシーを持っています。そのため、同じコマンドでも pip 経由と uv 経済由で入るバージョンが異なるケースがありえます。ただし大半の一般的なケースでは気にしなくてよい差異であり、uv 側でも将来の互換性改善が議論されています。
  • 環境の一元管理: pip はあくまで「パッケージインストールツール」で、仮想環境作成にはvenv、依存関係のロックにはpip-toolsPoetryなど他のツールが必要でした。uv は単体でプロジェクトの仮想環境作成からパッケージ管理、Python 本体の切替、ロックファイル管理まで対応しています。つまり uv 一つで、従来は pip + venv + pip-tools(または Poetry/Pipenv)+ pyenv…と複数併用していた機能をカバーできる統合ツールです。初心者にとっても、複数ツールを覚える必要が減るのはメリットでしょう。

総じて、uv は「中身はまったく新しいけれど、表向きは pip ライク」な存在と言えます。既存のワークフローになじませやすく、なおかつ性能が劇的に向上するため、試してみる価値は大いにあります。

uv 特有のファイル – pyproject.toml と uv.lock の意味

uv を使うと、プロジェクトフォルダ内に見慣れないファイルが生成されます。それがpyproject.tomluv.lockです。それぞれ役割がありますので押さえておきましょう。

  • pyproject.toml: これは Python のプロジェクトの設定を記述するためのファイルです。元々 PEP(Python Enhancement Proposal)で定められた従来の設定ファイルで、プロジェクト名やバージョン、依存ライブラリの一覧などを記載します。uv ではpyproject.toml内の[project]セクションにdependencies(依存関係)としてライブラリ名とバージョン指定が追記されていきます。例えば先ほどuv add pytestを実行した場合、pyproject.toml の中にdependencies = ["pytest"]のような行が追加されます(実際はバージョン指定も含まれます)。要するに、プロジェクトで必要なライブラリを宣言するファイルであり、Poetry など他のツールでも用いられる共通フォーマットです。
  • uv.lock: こちらはロックファイルと呼ばれるものです。簡単に言えば、「このプロジェクトで実際にインストールしたすべてのパッケージとそのバージョンを記録したスナップショット」のようなファイルです。uv ではuv adduv lock実行時に自動的にuv.lockが生成/更新され、そこに直接・間接すべての依存パッケージとその正確なバージョン、ハッシュ値などが書き込まれます。例えばpytestを追加した場合、pytest 本体のバージョンだけでなく、その依存であるpluggypackaging等のバージョンもすべて記録されます。

ロックファイルがあることで、チーム開発や将来の環境再現が容易になります。全員が同じバージョンの組み合わせで開発できるため、「ある人の環境では動くのに別の人の環境では動かない」という事態を防げます。また、一度決まった組み合わせを次回からそのまま使えるので、毎回依存解決をやり直す必要がなくインストールがさらに高速になります。

uv.lock は手動で編集する必要はなく、むしろ内容を人間が細かく把握する必要もありません(長大な一覧になります)。重要なのは、このファイルをGit などバージョン管理に含めて共有することです。こうすることで、別の開発者がリポジトリをクローンしてuv syncするだけで、全く同じ環境が復元されます。

requirements.txt との違い

Python で依存関係を記録・共有する方法としては、昔からrequirements.txtというファイルもよく使われてきました。これは単にライブラリ名==バージョンを羅列したテキストファイルで、pip install -r requirements.txtでそのリストのパッケージをインストールできるものです。uv.lock と requirements.txt は目的が似ていますが内容の詳細さに違いがあります。

  • uv.lock は上記のようにすべての依存関係(transitive dependencies も含む)と正確なバージョン、ハッシュ値等を記録した詳細なファイルです。環境を再現することに特化しており、開発時の再現性・安定性を担保します。
  • requirements.txt は基本的に直接依存のパッケージのみを列挙する場合が多く、シンプルですが詳細な依存ツリーまでは含みません。その分、pip やその他のツールでも幅広く扱える互換性の高い形式です。

uv を使って開発する際は原則 uv.lock を使えば十分ですが、例えばデプロイ環境で uv が使えない場合や、他のサービス(CI ツールなど)が requirements.txt しか受け付けない場合もあるでしょう。そんなときのために、uv にはuv export -o requirements.txtというコマンドが用意されており、現在の uv.lock の内容からピン留め(固定)されたバージョン一覧を requirements.txt 形式で出力できます。

このようにして作った requirements.txt を使えば、uv を直接使わない環境でも同じパッケージ群をインストールできます。ただし基本的には、開発・テストでは uv.lock を使い、必要に応じて出力した requirements.txt は配布や一時的な用途に留めるのがよいでしょう。

uv 利用上の注意点 – pip との併用に要注意!

最後に、uv を使う上での注意点や初心者がハマりがちなポイントをいくつか紹介します。便利な uv ですが、使い方を誤ると思わぬ混乱を招くこともありますので気をつけましょう。

pip コマンドを直接使わない(uv 経由で使う)

uv 導入後に最も陥りがちなのは、うっかり従来どおりにpip installコマンドを実行してしまうケースです。例えば仮想環境を有効にしていない状態でpip install XXXとしてしまうと、それはシステム全体にインストールされてしまい、uv 管理の環境には反映されません。逆に仮想環境が有効な状態で pip コマンドを直に使うと、ライブラリ自体は仮想環境に入りますがuv の lock ファイルや設定は更新されないため、実際の環境と uv.lock との内容がズレてしまう可能性があります。この「依存関係のズレ」が起きると、後でuv syncしたときに余計なパッケージが削除されたり、逆に存在しないはずのパッケージが残ってuv treeに表示されない等、混乱のもとになります。

要するに、uv を使い始めたら、パッケージの追加・削除には必ず uv 経由のコマンドを使う習慣をつけましょう。インストールならuv addまたはuv pip install、アンインストールならuv removeまたはuv pip uninstallといった具合です。pip の実行をすべて uv に仲介させることで、uv 側で状況を正しく把握でき、lock ファイルも正確に保たれます。

万一、「uv を付け忘れて pip コマンドを実行してしまった!」という場合の対処法も覚えておきましょう。一番確実なのは、仮想環境内からそのパッケージを削除して環境をクリーンに戻すことです。具体的には:

pip freeze > uninstall.txt # 仮想環境内の全パッケージ一覧を出力
pip uninstall -r uninstall.txt -y # その一覧に載っているパッケージを一括アンインストール

とする方法があります。この手順で仮想環境を一度まっさらにしてから、改めてuv syncを実行すれば、uv.lock に基づいて正しい状態に復元できます(いったん環境をリセットし、uv.lock→ 環境を同期し直すイメージです)。実際、pip には-rオプションで一覧に記載のパッケージをまとめて削除する機能があり、上記のようにpip freezeの結果を使うことで「インストールされているものを全部消す」ことが可能です。この操作は強力なので、他に影響が出ないか注意しつつ自己責任で行ってください。

uv コマンドと仮想環境の関係

uv はuv runコマンドを使うことで、仮想環境を自動で利用してコマンドを実行できます。例えば、前述のuv run pytestでは、仮想環境を有効化した状態で pytest を走らせてくれます。これは便利な反面、直接仮想環境をアクティベートして作業する場合との挙動の違いに注意しましょう。

通常、仮想環境を使う場合はsource .venv/bin/activate(Windows では.\.venv\Scripts\activate)を実行してから作業します。uv ではuv runを使えば activate しなくてもよいのですが、対話的に仮想環境に入って作業したい場合は従来通り activate しても構いません。activate してしまえば、あとの操作は普通の pipenv などと同じ感覚で、pythonコマンドやpip list等も仮想環境上で動きます。ただし先述の注意 ➀ の通り、activate 中でも新たなパッケージ追加はuv addで行うようにしてください(pip を直接使うと uv に情報が行かない点は同じです)。

また、uv が作る仮想環境の名前にも触れておきます。デフォルトでは.venvフォルダに仮想環境を構築しますが、uv venv <フォルダ名>コマンドで別名の環境を作ることもできます。しかしその場合、環境を activate しないとuv pip系コマンドがうまく動作しないという現象が知られています (Uv gotchas // Railslide // Code, experiments, and thoughts)(カレントディレクトリに.venvがないために uv が環境を見つけられない)。初心者のうちは特別な理由がない限りデフォルトの.venvを使うのがおすすめです。

まとめ

今回は、Python 初心者の方に向けてパッケージ管理ツール「uv」の概要と使い方、メリット・注意点を解説しました。最後に内容を簡単に振り返ってみましょう。

  • uv とは: Rust 製の高速 Python パッケージマネージャーで、pip や venv 等を統合したオールインワンツール。ライブラリのインストールや依存関係解決が非常に速く、環境構築のストレスを大幅に軽減してくれる。
  • 高速化の仕組み: 並列ダウンロード、キャッシュの活用、必要部分のみの取得などにより、pip のボトルネックを解消している。その結果、場合によっては pip の 10 倍以上の速度で処理が完了する。
  • 仮想環境と依存管理: uv は仮想環境を自動で作成・管理し、pyproject.toml で依存を宣言、uv.lock で確定したバージョンを保存する。これにより開発環境の再現性が担保され、チーム開発でも安心。
  • 基本コマンド: uv initでプロジェクト開始、uv add/uv removeでパッケージ追加削除、uv syncで環境同期、uv runで環境内実行など、直感的なコマンドが用意されている。
  • pip との違い: 操作感は似ているが、処理速度や依存解決アルゴリズムが洗練されている点で優れる。pip+α のツールをまとめて置き換え可能で、初心者にも扱いやすい設計。
  • 注意点: uv 使用時は pip コマンドを直接使わないようにし、常に uv 経由で操作する(そうしないと環境が不整合になる恐れ)。また他の環境管理ツールとの二重管理にならないように気をつける。

最初は新しいツールに戸惑うかもしれませんが、実際に使ってみると「とにかく速くて快適」というのが率直な感想になるでしょう。Python 初心者の方でも、uv を使えば仮想環境の作成から依存関係の管理、パッケージの追加までスムーズに行えます。何より、環境構築に余計な時間を取られずコーディングに集中できるのは大きなメリットです。

ぜひ一度、あなたの Python プロジェクトで uv を試してみてください。その高速さと便利さに驚くはずです。快適な Python ライフを応援しています!

]]>
コーディング支援AI Unblockedで快適にPythonプログラミングhttps://python-engineer.co.jp/unblocked/Fri, 25 Oct 2024 04:03:08 +0000https://python-engineer.co.jp/?p=887

AIの発展が著しい今日、コーディングにおいてAIとの協働は欠かせないないものになっています。どのAIもそれぞれ特徴があり、費用がかかるものもあるので選定に迷うところです。 私自身はChatGPTやClaudeといったもの ... ]]>

AIの発展が著しい今日、コーディングにおいてAIとの協働は欠かせないないものになっています。どのAIもそれぞれ特徴があり、費用がかかるものもあるので選定に迷うところです。

私自身はChatGPTやClaudeといったものから、コーディング特化を謳っているGithub CopilotやJetBrains AI Assistantを比較しながら使っています。

コーディング特化AIの多くは有料ですが、この記事では無料で使える優れたAIアプリを紹介します。

コーディング特化AI

コーディング特化であるGithub CopilotやJetBrains AI AssistantはIDEのプラグインとして提供されており、プロジェクト内のモジュールやコードを指定することで文脈に応じた回答を期待できいい感じです。

下図はモジュールを指定しているところです。JetBrains AIのものですがGithub Copilotも同じような感じでモジュールを指定します。モジュールを指定したうえでプロンプトを入力し回答してもらいます。

これはこれでいい感じなのですが、プロジェクトが大きくなり複数のモジュール間で連携が必要な場合モジュール指定が面倒です。というちょっとした不満を持っていましたが、さらにいい感じのAIを見つけましたので共有します。

Unblockedというアプリです。

Unblockedが何が嬉しいのか

このアプリ、何がいいかというとGithubを読み込んで回答してくれる点です。つまりAIがプロジェクト全体を理解したうえで回答してくれる、ということです。

まずはアカウントを作成してデータソースからGitHubと連携します。

さらに読み込ませるレポジトリを選択します。

あとはこんな感じでAIとやりとりします。

上の画像はブラウザでのやりとりですが、IDEのプラグインもあり、チャットは同期されます。

Github CopilotやJetBrain AIはどちらも有料ですが、なんとこのアプリは無料です。チームでの利用を前提としているアプリなので個人には無料で開放しているのでしょう。

前者のコーディング特化AIの2つと遜色ないどころかプロジェクト全体を理解しているためかより的確な回答を得られる印象です。

Githubにレポジトリがあり、プッシュしていないと最新情報を認識してくれませんが、かなり有用です。

Unblocked ぜひ使ってみてください。

]]>
Pythonの仮想環境(venv)とは?初心者のための完全ガイドhttps://python-engineer.co.jp/what-venv/Wed, 03 Jul 2024 02:05:58 +0000https://python-engineer.co.jp/?p=568

Pythonを学び始めると「仮想環境」という言葉を耳にして「仮想?」「環境?」どういうこと? となりませんか? この記事ではPythonの仮想環境(venv)について、解説していきます。 目次 venvとは何か? なぜ仮 ... ]]>

Pythonを学び始めると「仮想環境」という言葉を耳にして「仮想?」「環境?」どういうこと? となりませんか? この記事ではPythonの仮想環境(venv)について、解説していきます。

venvとは何か?

venvは「virtual environment(仮想環境)」の略称です。簡単に言えば、コンピュータの中に独立したPython環境を作ることです。

現実の例で喩えるとグローブボックスのようなものです。箱の中で行ったことを箱の外の環境に影響が及ばないようにするために用います。

なぜ仮想環境が必要なのか?

プログラミングを進めていくと、プロジェクトによって異なるバージョンのPythonやライブラリを使いたい場合が出てきます。しかし、仮想環境を使わない通常の環境では、1つのライブラリに対して1つのバージョンしかインストールできません

例えば:

  • プロジェクトAではライブラリXのバージョン2が必要
  • プロジェクトBではライブラリXのバージョン3が必要

このような状況で、仮想環境が役立ちます。仮想環境を使えば、プロジェクトごとに独立した環境を作り、それぞれに必要なバージョンのPythonやライブラリをインストールできます

「仮想」という名前が付いていますが後述するように、実体はディレクトリ(フォルダ)とそこに格納されたPythonインタープリタやその他のファイル群です。システムにインストールされたpython.exeとは別の場所に作られ、仮想環境外に影響が及ばないようになります。

「環境」とは「実行環境」のことで以下の要素でできています。これらをシステム全体とは別の場所に作ることでプロジェクト固有の実行環境として利用できるようになります。

要素解説
Pythonインタープリターシステム全体のPythonバージョンとは異なるバージョンを使用できる
サイトパッケージ仮想環境専用のサイトパッケージディレクトリが作成される。ここにインストールされたパッケージやライブラリは、この仮想環境内でのみ利用可能。
実行スクリプト仮想環境に出入りするためのスクリプト群

仮想環境の作り方

PyCharmなどの統合開発環境(IDE)を使用している場合、仮想環境が自動的に作成されることがあります。しかし、IDEを使わずにPythonを実行する機会も多いでしょう。そんな時は、以下の方法で仮想環境を作成できます。

基本的な作り方

コマンドプロンプトやターミナルで以下のコマンドを実行します:

python -m venv venv

※ Macの場合は python の代わりに python3 を使用してください。

実行するとシステムのデフォルトPythonバージョンが使われます。

python --version

Python 3.11.2がデフォルトであれば以下のように仮想環境が作成されます。python.exeを見ただけではわかりませんが、pip3.11.exeと表示されているので判別できますね。

特定のPythonバージョンで仮想環境を作る

特定のバージョンのPythonを使用したい場合は、以下のようにします。

Windows:

py -3.10 -m venv venv

Mac:

python3.10 -m venv venv

コマンドを実行すると以下のようにPythonのバージョンを指定して仮想環境を作成できます。

ただし、システムに対象バージョンのPythonがインストールされていなければなりません。

仮想環境の使い方

仮想環境に入る

仮想環境に入るには以下のコマンドを実行します。

Windows:

venv\Scripts\activate

Mac:

source venv/bin/activate

仮想環境に入るとターミナルの行頭に (venv) と表示されます。

ちなみにこのコマンドで実行しているactivateの実体はバッチやスクリプトファイルです。

仮想環境を終了する

仮想環境を終了するには、以下のコマンドを使用します(WindowsもMacも共通)。ターミナル行頭の(venv)の表示が消え仮想環境から出たことが分かります。

deactivate

初心者つまずきポイント

特に初心者のうちは忘れがちですが、ライブラリをインストールは仮想環境に入ってから行うようにしましょう。そうしないと先述したとおりシステム全体に対してライブラリをインストールすることになってしまいます。

間違えてシステム全体にインストールしてしまった場合はアンインストールするpipコマンドを実行してください。

pip uninstall <ライブラリ名>

途中で本当に削除していいか? の確認がありますのでyを入力して先に進みアンインストールします。

システムにインストールされているライブラリをまとめてアンインストールする

間違えてインストールしたライブラリが複数の依存関係があるものだと関連するライブラリも同時にインストールされます。Djangoであれば以下のようになります。

PS C:\Users\ikuma\Downloads> pip freeze
asgiref==3.8.1
Django==5.0.6
sqlparse==0.5.0
tzdata==2024.1

このようなとき、上記の方法で一つ一つアンインストールするのは面倒です。以下の要領でまとめて削除するとよいです。

1. インストールされている全ライブラリをテキストファイルに出力する

pip freeze コマンドの出力をテキストファイルに出力します。出力先のファイル名はなんでも構いません。

pip freeze > <ファイル名>

例えばpip freeze > hoge.txtのようにします。

2. pip uninstall の -r と-y オプションでまとめてアンインストール

アンインストールの対象を上記手順で出力したファイルに書き込まれているものするためのオプションが-rです。

-yはアンインストール確認をすべてyにするためのオプションです。

pip uninstall -r <ファイル名> -y

pip uninstall -r hoge.txt -yのようにします。これでスッキリ。システム全体から誤ってインストールしてしまったライブラリをまとめてアンインストールできます。

最近流行している仮想環境 uv について

最近は uv という仮想環境管理ツールがはやっています。pip install に比べて5~10倍ほど高速に動作します。詳しくは以下をご覧ください。

まとめ

Pythonの仮想環境(venv)は、プロジェクトごとに独立した開発環境を作るための強力なツールです。初心者の方々も、プロジェクトを進める中で仮想環境の使用に慣れていくことで、より効率的で管理しやすい開発が可能になります。

プログラミングの世界では、整理整頓が大切です。仮想環境を上手に活用して、クリーンで効率的なPython開発を楽しんでください!

]]>
Pythonのsetterとgetterで使う関数名が同じなのはなぜか? どうやって使い分けているのか?https://python-engineer.co.jp/property-decorator/Wed, 19 Jun 2024 05:11:38 +0000https://python-engineer.co.jp/?p=832

Pythonの@propertyデコレータと@<name>.setterデコレータを使うと同じ名前で属性(プロパティ)に対して取得と設定ができますよね。多くの方はなぜ「同じ名前で2つの挙動に変化するのか?」と ... ]]>

Pythonの@propertyデコレータと@<name>.setterデコレータを使うと同じ名前で属性(プロパティ)に対して取得と設定ができますよね。多くの方はなぜ「同じ名前で2つの挙動に変化するのか?」と疑問に思わず通り過ぎますが、探究心旺盛なあなたのために

  • 「なぜsetterとgetterが同じ名前なのか?」
  • 「内部ではどのように使い分けられるのか?」

を解説します。

=演算子が使われたときはgetterがそうでなければsetterが実行される

結論から端的に述べると、=演算子が使われたときはgetterが、そうでなければsetterが実行されます。

例えば以下のコードでは同じageという名前でHumanクラスの_ageプロパティに値を設定・取得できます。=演算子を使ったときは42という値を設定、print(ikuma.age)のときは値を取得できます。

class Human: def __init__(self, name): self.name = name self._age = 0 @property def age(self): return self._age @age.setter def age(self, age): self._age = int(age)
ikuma = Human("ikuma")
ikuma.age = 42
print(ikuma.age) # 42

なぜこのように同じ名前で異なる挙動になるのでしょうか?

同じ名前で設定と取得できた方が読みやすく保守しやすい

そもそもの設計思想的には「設定と取得が同じ名前のほうがいいよね」、というものがあるのだと思います。その方がコーディングしやすく、コードも読みやすく、保守しやすいからです。

そのための実装が@<name>setterデコレータを使ったsetterと@propertyデコレータを使ったgetterです。公式ドキュメントに記載があります。

class property — Python 3.12.4 ドキュメント

興味深いことに、このドキュメントには@propertyデコレータを使わずにgetter、setterと同じ機能を実装する方法が以下のように書いてあります。(一部省略)

class C: def __init__(self): self._x = None def getx(self): return self._x def setx(self, value): self._x = value x = property(getx, setx, "I'm the 'x' property.")

つまりproperty関数にgetterたるgetxメソッド、setterたるsetxメソッドを渡すことでproperty関数の戻り値が変数xに格納され、xを介して設定と取得を制御できます。

propertyクラスの実装を確認する方法

上でproperty関数と述べましたが、実際はクラスです。PyCharmpropertyクラスで右クリックして「型宣言」を選択すると、builtins.pyiのclass propertyに移動してそれが確認できます。

VSCodeではpropertyクラスで右クリックして「定義へ移動」するとbuiltins.pyiが表示され確認できます。

設定・取得の使い分けは__set__と__get__で行う

取得と設定をどのように使い分けるか? についてですが、このclass propertyの中に__set__メソッドと__get__メソッドがあり、設定と取得に対応しています。

=演算子が使われたら__set__が呼ばれfsetメソッドを実行、そうでなければ__get__が呼ばれfgetメソッドが実行されます。fsetfgetpropertyインスタンス生成時に設定します。もしくは追加の属性として後から設定します。

x = property(getx, setx, "I'm the 'x' property.")
# 以下のように分けてもよい
# x = property(getx, "I'm the 'x' property.")
# x.setter(setx)

=演算子を使ったときの挙動はクラスの__eq__メソッド呼出しのようなものですね。(__eq__メソッドは==演算子で比較されたときに呼び出されるメソッドです)

class obj: def __init__(self, x): self.x = x def __eq__(self, y): print("==で比較されました") return self.x == y
o = obj(1)
print(o == 1) # True
print(o == 2) # False

ここまでを冒頭Humanクラスに当てはめると以下のようになります。

class Human: def __init__(self, name): self.name = name self._age = 0 def _get_age(self): return self._age def _set_age(self, age): self._age = int(age) age = property(_get_age) age = age.setter(_set_age)
# 以下のコードと等価
# class Human:
# def __init__(self, name):
# self.name = name
# self._age = 0
#
# @property
# def age(self):
# return self._age
#
# @age.setter
# def age(self, age):
# self._age = int(age)

age = property(get_age)でゲッターを設定し、次にage.setter(set_age)でセッターを設定しています。これでageという名前でセッター、ゲッターを使い分けられるようになります。

@propertyデコレータでセッターとゲッターをPythonicに書く

これをよりスマートに、Pythonicにしたのが@propertyデコレータを使った記法です。

class Human: def __init__(self, name, height, weight): self.name = name self._age = 0 @property def age(self): return self._age @age.setter def age(self, age): self._age = int(age)

デコレータの文法と挙動は以下のようになりますよね。つまりデコレータ関数の引数func関数本体が渡されます。

def デコレータ関数(func): def ラッパー関数(*args, **kwargs): # 前処理 result = func(*args, **kwargs) # 後処理 return result # 渡された関数の結果を返却 return ラッパー関数
@デコレータ関数
def 関数本体(): # 何らかの処理
result = 関数本体()

冒頭Humanクラスではageメソッドに@propertyが付いていますので、property関数(実際はクラス)にはageが渡されます。@age.setterpropertyインスタンスにセッターを設定しています。これで同じageという名前で使い分けられるようになります。

class Human: def __init__(self, name): self.name = name self._age = 0 @property def age(self): return self._age @age.setter def age(self, age): self._age = int(age)
ikuma = Human("ikuma")
ikuma.age = 42
print(ikuma.age) # 42

つまり@propertyデコレータを使うことで任意のメソッドがpropertyインスタンスになり、同じ名前のメソッドが=演算子の有無によって__set____get__が使い分けられる仕組みです。

propertyクラスのCpythonの実装

ちなみにPyCharmで表示できるbuiltins.pyiでは以下のように__get____set__の実装がよく分かりませんよね。

Pythonの実装であるCPythonのdescrobject.cを見るともう少し詳しく書いてあります。

ただ、このあたり私も詳しくはよく分かりませんので雰囲気だけでもつかんでいただければと。

まとめ

この記事では

  • なぜ@propertyデコレータを使うと同じ名前でプロパティに対して取得と設定ができるのか?
  • なぜsetterとgetterが同じ名前なのか?
  • 内部ではどのように使い分けられるのか?

という疑問を解説しました。結論は@propertyデコレータを使うことで任意のメソッドがpropertyインスタンスになり、=演算子の有無によって同じ名前のメソッドが設定と取得に使い分けられるようになります。

]]>