🐍

【Global Azure 2025】Gitub Copilot Hands-on Lab for Python

に公開

はじめに

この記事では、GitHub Copilotを使用してPythonでの開発を支援する方法を学ぶためのハンズオンラボを紹介します。

05-Using-GitHub-Copilot-with-Pythonをもとに作成したハンズオンラボです。

誤りや不具合がある場合は随時修正予定です。

事前に読んでおくと良い資料

ハンズオンの準備

  1. Enable your GitHub Copilot service
  2. Open this repository with Codespaces

ハンズオンで対応すること

  • ステップ1:Pydanticモデルを追加する
  • ステップ2:新しいエンドポイントを生成する
  • ステップ3:コードを説明する
  • ステップ4:スラッシュコマンドを使用する

ここからハンズオン

以下のCodespacesボタンを右クリックして、Codespaceを新しいタブで開きます。

Open in GitHub Codespaces

APIにはすでにトークンを生成するための単一のエンドポイントがあります。
テキストを受け入れ、トークンのリストを返す新しいエンドポイントを追加してAPIを更新しましょう。

🛠 ステップ1:Pydanticモデルを追加する

main.pyファイルを開き、提供されているコードの末尾に移動し、**Ctrl + I(PC)またはCmd + I(Mac)**を押して、GitHub Copilot Chatボックスに以下の内容をコピー&ペーストして、Pydanticモデルを生成します。

Create a Pydantic model so that I can use it in a new route that will accept JSON with text as a key which accepts a string.

(日本語訳:
文字列を受け付けるtextというキーを持つJSONを受け入れる新しいルートで使用できるように、Pydanticモデルを作成してください。)

生成されるモデルは次のようになります。

    class TextData(BaseModel):
        text: str

[!NOTE]
エディタにいくつかのリンター警告(赤い点線の下線で識別可能)が表示される場合がありますが、これらは無視してかまいません。
これらのエラーはPythonのコーディング規約に沿っていないために発生しますが、アプリケーションの実行には影響しません。

(オプション):flake8のエラーを無視する

flake8のエラーを無視するには、.flake8ファイルをリポジトリの中に作成し、以下の内容を追加します。

[flake8]
ignore = E501,W292

E501は行が長すぎることを示し、W292はファイルの最後に改行がないことを示します。
これらの警告は可読性に関する警告であり、アプリケーションの実行には影響しないため、無視しても問題ありません。

🔎 ステップ2:新しいエンドポイントを生成する

次に、main.pyファイルの最後のルートの下、一番最後にコメントを追加して、GitHub Copilotで新しいエンドポイントを生成します。

# Create a FastAPI endpoint that accepts a POST request with a JSON body containing a single field called "text" and returns a checksum of the text

(日本語訳:
「text」という単一のフィールドを含むJSONボディを持つPOSTリクエストを受け付け、そのテキストのチェックサムを返すFastAPIエンドポイントを作成してください。)

インポートされていないモジュールやライブラリを使用する提案が表示されることがあります。その場合は、生成されたコードを選択し、Command+I(Apple)またはControl+I(Windows)を使用して、不足しているインポートを追加するようGitHub Copilotに依頼できます。
この小さなポップアウトはインラインチャットと呼ばれ、GitHub Copilotと対話するもう1つの方法です。

生成されるコードは以下のとおりです。

# Create a FastAPI endpoint that accepts a POST request with a JSON body containing a single field called "text" and returns a checksum of the text
@app.post('/checksum')
def checksum(body: TextBody):
    """
    Generate a checksum of the text. Example POST request body:

    {
        "text": "Hello, world!"
    }
    """
    checksum = base64.b64encode(os.urandom(64)).decode('utf-8')
    return {'checksum': checksum}

🐍 ステップ3:コードを説明する

現在開いているmain.pyにはすでに擬似乱数トークンIDを作成するAPI(/generate)が定義されています。

関数全体を選択し、選択範囲を右クリックしてCopilotメニュー項目を選択し、次に「選択内容をチャットに追加」を選択します。
GitHub Copilotチャットインターフェースが開き、対話形式でできるようになります。

次に、以下のプロンプトを入力します。

選択されたコードを説明してください

最後に、/docsエンドポイントにアクセスして新しいエンドポイントが機能していることを確認します。

/docsエンドポイントはOpenAPIドキュメントを生成するためのエンドポイントです。
/docsエンドポイントにアクセスすると、FastAPIが自動的に生成したOpenAPIドキュメントが表示されます。

このドキュメントには、/generateエンドポイントと新しく作成した/checksumエンドポイントの両方が含まれています。

以上でGitHub Copilotを使用してコードの生成およびコードの説明ができることを確認しました。

💡 ステップ4:スラッシュコマンドを使用する

ステップ3まででGitHub Copilotを使用してコードを生成して説明までできました。

ステップ4からは開発タスクを実行するための他の代替アプローチもいくつか試すことができます。
これらの追加の課題は、すでに知っている機能に加えて、他のGitHub Copilot機能をより深く掘り下げるのに役立ちます。

これらの追加の課題では、チャットインターフェースを使用します。
まだ開いていない場合は、GitHub Copilotチャットアイコンをクリックします。

ドキュメントを生成する

main.pyを開いた状態で、チャットインターフェースに以下のテキストを入力します。

/doc I need to document the routes for these API Routes. Help me produce documentation I can put in the README.md file of this project

(日本語訳:/doc これらのAPIルートのルートを文書化する必要があります。このプロジェクトのREADME.mdファイルに記載できるドキュメントを作成するのを手伝ってください。)

プロンプトの/docの部分は「スラッシュコマンド」と呼ばれ、ドキュメントを作成できるGitHub Copilotの特定の機能です。
なお、スラッシュコマンドは、GitHub Copilotに特定のタスクを実行するよう指示するための方法です。

テストを生成する

現在のコードにはテストがありません。
この課題では、/testsスラッシュコマンドを使用します。main.pyを開いた状態で、チャットインターフェースに以下のプロンプトを入力します。

/tests help me write a test for the generate() route using the FastAPI test client and the Pytest framework. Help me understand where I should put the test file, how to add the Pytest dependency to my project, and how to run the tests

(日本語訳:
/tests FastAPIテストクライアントとPytestフレームワークを使用して、generate()ルートのテストを作成するのを手伝ってください。テストファイルをどこに置くべきか、Pytestの依存関係をプロジェクトに追加する方法、テストを実行する方法を理解するのを手伝ってください。)

/testsスラッシュコマンドは、ルートの新しいテストを作成する方法を案内し、作業を確認するために必要なものすべてを提供します。

今回はPythonによる演習であるためテストには、pytestを使用します。
pytestは、Pythonのテストフレームワークであり、テストの作成と実行を簡素化します。
pytestは、Pythonの標準ライブラリに含まれていないため、プロジェクトに追加する必要がありますが、GitHub Copilotはセットアップ方法と使い方を提案してくれます。

おそらくGitHub Copilotは、requirements.txtファイルにpytestを追加してインストールする方法を提案してくれるでしょう。
もしGitHub Copilotが提案しない場合は以下のように手動でインストールできますのでターミナルを開いて実行するようにしてください。

pip install pytest

pytestがインストールが完了したら次にテストを書きます。
pytestによるテストは、testsディレクトリに配置するのが一般的です。testsディレクトリは、以下のような配置・構造になります。

webapp/
├── main.py  # FastAPIアプリケーション
├── requirements.txt
├── README.md
└── tests/
    └── test_generate.py  # テストファイル

なお、GitHub Copilotで生成されるテストは、以下のような内容になる想定です。

test_generate.py
from fastapi.testclient import TestClient
from main import app  # FastAPIアプリケーションが定義されているファイルをインポート

client = TestClient(app)

def test_generate_success():
    # テスト用のリクエストデータ
    request_data = {
        "key": "value"  # 必要に応じてリクエストボディを変更
    }

    # POSTリクエストを送信
    response = client.post("/generate", json=request_data)

    # ステータスコードの確認
    assert response.status_code == 200

    # レスポンスボディの確認
    response_data = response.json()
    assert "result" in response_data  # 必要に応じてレスポンスのキーを変更
    assert response_data["result"] == "expected_value"  # 必要に応じて期待値を変更

def test_generate_invalid_request():
    # 無効なリクエストデータ
    request_data = {
        "invalid_key": "value"
    }

    # POSTリクエストを送信
    response = client.post("/generate", json=request_data)

    # ステータスコードの確認
    assert response.status_code == 400  # 必要に応じてエラーコードを変更
    assert response.json()["detail"] == "Invalid request"  # 必要に応じてエラーメッセージを変更

テストファイルを作成したら、次にテストを実行します。

まずはwebappディレクトリに移動します。

cd webapp

ターミナルを開いて、以下のコマンドを実行します。

PYTHONPATH=/workspaces/mslearn-copilot-codespaces-python/webapp pytest tests/test_generate.py

実行結果

================================= test session starts =================================
platform linux -- Python 3.8.17, pytest-7.3.1, pluggy-1.0.0
rootdir: /workspaces/mslearn-copilot-codespaces-python/webapp
plugins: anyio-4.5.2
collected 0 items / 1 error                                                           

======================================= ERRORS ========================================
_______________________ ERROR collecting tests/test_generate.py _______________________
/home/vscode/.local/lib/python3.8/site-packages/starlette/testclient.py:23: in <module>
    import httpx
E   ModuleNotFoundError: No module named 'httpx'

During handling of the above exception, another exception occurred:
tests/test_generate.py:1: in <module>
    from fastapi.testclient import TestClient
/home/vscode/.local/lib/python3.8/site-packages/fastapi/testclient.py:1: in <module>
    from starlette.testclient import TestClient as TestClient  # noqa
/home/vscode/.local/lib/python3.8/site-packages/starlette/testclient.py:25: in <module>
    raise RuntimeError(
E   RuntimeError: The starlette.testclient module requires the httpx package to be installed.
E   You can install this with:
E       $ pip install httpx
=============================== short test summary info ===============================
ERROR tests/test_generate.py - RuntimeError: The starlette.testclient module requires the httpx package to be ins...
!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!
================================== 1 error in 0.51s ===================================

httpxというモジュールが足りないというエラーで終わると思いますので、以下のコマンドを実行して必要なモジュールをインストールします。

pip install httpx==0.27.2 

httpxをインストールしたら、再度テストを実行します。

PYTHONPATH=/workspaces/mslearn-copilot-codespaces-python/webapp pytest tests/test_generate.py

workspaceを使用する

最後に、「エージェント」を使用する機会があります。

エージェントは、Visual Studio CodeのGitHub Copilotの特別な機能であり、特定のコンテキストをGitHub Copilotと共有できます。
この最後の課題では、現在のワークスペースのファイルを含めてより多くのコンテキストを提供する@workspaceエージェントを使用します。
アプリケーション全体を実行する方法に関連する問題を解決します。この場合、複数のファイルにまたがる詳細についてREADME.mdを強化します。

@workspaceを使用するとより多くのコンテキストをGitub Copilotに提供できます。
この課題では、ファイルを開いておく必要はありません。GitHub Copilotチャットウィンドウに以下のプロンプトを入力します。

@workspace I want to provide instructions on how to run this application using the uvicorn webserver, I also need to provide instructions on how to install the dependencies properly and what are some characteristics of the FastAPI framework. I will use this to improve the README.md file

(日本語訳:@workspace uvicornウェブサーバーを使用してこのアプリケーションを実行する方法についての指示を提供したいです。また、依存関係を適切にインストールする方法と、FastAPIフレームワークのいくつかの特性についての指示も必要です。これを使用してREADME.mdファイルを改善します。)

※結果はFastAPI、アプリケーションの実行方法、依存関係のインストール方法に関する説明になる想定です。

まとめ

GitHub Copilotを使用して、Pythonでの開発を支援する方法を学ぶためのハンズオンラボを紹介しました。

Discussion