Copilot無償版
演習シナリオ
Pythonで顧客管理を行うWebアプリケーションを作成したいと考えています。
ひとことでPythonと言っても、所属する業態や法人により記述作法が定義されています。
この演習では PEP 8(Style Guide for Python Code) を
サンプルとして、作法にのっとったコードの生成を試してみます。
演習手順
①作法を認識させます。
この演習では、作法の文書化からとりかかります。
組織内に文書化されているものがあればそちらを流用してください。
次のプロンプトを実行してください。
PEP8にのっとったコーディング作法について生成してください。
このあとPythonのコーディングをしてもらいたいので、
AIに作法を網羅させることができるような粒度でお願いします。
次のような出力を得ることができます。
PEP8(Python Enhancement Proposal 8)は、Pythonコードの可読性と一貫性を高めるためのスタイルガイドです。コーディング作法に移る前に、AIが「作法を網羅できる粒度」でPEP8の要点を整理します。
🧠 PEP8に基づくPythonコーディング作法(網羅的な粒度)
1. インデント
- スペース4つを使用(タブは使用しない)
def func():
if True:
print("Hello")
2. 最大行長
- 1行は79文字以内(コメントは72文字以内が推奨)
3. 空白の使い方
演算子の前後にスペース
x = a + b
コンマの後にスペース
items = [1, 2, 3]
関数の引数の前後にスペースを入れない
func(a, b) # OK
func( a, b ) # NG
4. 空行
- トップレベルの関数やクラスの間には2行の空行
- クラス内のメソッド間には1行の空行
5. インポートの順序
- 標準ライブラリ
- サードパーティライブラリ
- 自作モジュール
import os
import sys
import numpy as np
from mymodule import myfunc
6. 命名規則
| 種類 | スタイル | 例 |
|---|---|---|
| 変数名 | 小文字+アンダースコア | user_name |
| 関数名 | 小文字+アンダースコア | get_data() |
| クラス名 | キャメルケース | UserProfile |
| 定数 | 全大文字+アンダースコア | MAX_SIZE |
7. コメント
- コードの意図を明確にする
- 英語が推奨(日本語でもOKだが統一する)
- Docstring(関数やクラスの説明)は三重引用符で記述
def add(a, b):
"""2つの数値を加算して返す"""
return a + b
8. 不要なコードの削除
- 未使用の変数、インポート、関数は削除する
9. 例外処理
- 明示的に例外をキャッチし、適切に処理する
try:
result = 10 / 0
except ZeroDivisionError:
print("ゼロ除算エラー")
---
### 10. **可読性のための改行**
- 複雑な式は適切に改行する
```python
total = (first_variable
+ second_variable
- third_variable)
11. ファイル末尾の改行
- ファイルの最後には1つの改行を入れる
12. 型ヒント(Python 3.5以降)
def greet(name: str) -> str:
return f"Hello, {name}"
---
## ✅補足:PEP8チェックツール
- `flake8`
- `black`(自動整形)
- `pylint`
---
② 作法にのっとってコーディングを実施します。
最初に、先に生成された作法定義またはあなたの組織で準備されている作法定義を認識させます。
次のプロンプトを実施してください。
# 背景
あなたはPythonのコーディングを実施するプロフェッショナルです。
入力に記載された処理のコードを生成してください。
# 命令
先に生成した作法の定義を遵守してコードを生成してください。
/// あなたの組織で定義された文面があればここに貼り付け。 ///
/// その場合この命令の先頭行は削除してください。 ///
定義から外れる場合は、外れた個所を明記し、外れた理由を記載してください。
# 入力
"""
ローカルアカウントのユーザーIDとパスワードでログインできる。
ユーザーごとにアクセス権(閲覧のみ/編集可能)を付与できる。
ローカルのSQLiteと接続できる。
SQLiteのデータを登録、修正、削除できる。
データ登録、修正、削除機能をもったWeb画面を表示できる。
"""
# 出力
すぐにコンパイル可能なPythonコードとして出力してください。
先頭に内容が見て取れる簡潔なプログラム名の案を記載してください。
生成結果を確認してください。
次のような結果が生成されます。
✅ プログラム名案: user_access_webapp.py
以下は、指定された要件に基づいて作成された FlaskベースのPython Webアプリケーションです。
このアプリは以下の機能を備えています:
- ローカルアカウント(ユーザーIDとパスワード)でログイン
- ユーザーごとのアクセス権(閲覧のみ/編集可能)の管理
- SQLiteデータベースとの接続
- データの登録・修正・削除
- Web画面での操作インターフェース
🔧 主な構成要素
-
usersテーブル:ユーザー情報(パスワードはハッシュ化) -
dataテーブル:操作対象のデータ - Flaskセッションでログイン状態とアクセス権を管理
- HTMLテンプレートは
render_template_stringを使用して簡易表示
📦 SQLiteファイル
アプリ実行時に作成されるSQLiteファイルはこちらです:
📁 app.db
⚠️ 注意点
- このコードは 開発用サーバーで動作します。実運用には WSGIサーバー(例:Gunicorn) を使用してください。
- 実行環境でポート競合が発生しているため、起動時にエラーが出ています。別のポートを指定するか、既存のプロセスを停止してください。
次のステップは?
- ユーザー登録機能を追加する(現在はDBに直接登録が必要)
- テンプレートをHTMLファイルに分離して見やすくする
- BootstrapなどでUIを整える
③ AIに自己診断させてみる
生成されたコードに落ち度がないか自己診断させてみます。
次のプロンプトを実行してください。
# 命令
生成されたコードについて、次の視点から診断を実施してください
・セキュリティ脆弱性が含まれていないこと
・コメントの理解が容易であること
・無限ループの可能性が排除できていること
・その他あなたの知見から指摘できること
# 出力
命令内の各項目に対して、表形式で生成してください。
次の5列でお願いします。
診断日時(JST)、診断項目、診断結果、その理由、解消案、その他指摘事項
命令に従って生成されたコードが診断されたことを確認してださい。
次のような結果が生成されます。
以下は、生成されたFlaskアプリケーションコードに対する診断結果です。
診断日時は日本時間(JST)で記載しています。
| 診断日時(JST) | 診断項目 | 診断結果 | その理由 | 解消案 | その他指摘事項 |
|---|---|---|---|---|---|
| 2025/10/29 15:02 | セキュリティ脆弱性の有無 | △ | パスワードはハッシュ化されているが、CSRF対策が未実装。セッション固定攻撃やフォーム改ざんのリスクがある。 | Flask-WTFを導入し、CSRFトークンをフォームに追加。セッション管理に secure, httponly, samesite 属性を設定。 |
ユーザー名の重複チェックが未実装。登録時に例外処理を追加すべき。 |
| 2025/10/29 15:02 | コメントの理解容易性 | △ | 一部の改善点にはコメントがあるが、関数や処理の目的を説明するコメントが不足している。 | 各関数の冒頭に「この関数は〇〇を行う」などの説明コメントを追加。処理の流れがわかるように、主要なロジックにコメントを挿入。 | コード全体の可読性向上のため、PEP8に準拠したインデント・命名規則の見直しも推奨。 |
| 2025/10/29 15:02 | 無限ループの可能性 | ○ | Flaskのルーティングは明示的で、無限ループに陥る構造は見られない。POST後は必ずリダイレクトされている。 | 特に不要。ただし、リダイレクト先が存在しない場合のエラーハンドリングは追加してもよい。 |
redirect(url_for(...)) の使用は適切。 |
| 2025/10/29 15:02 | その他の知見からの指摘 | △ | HTMLテンプレートがコード内に埋め込まれており、保守性が低い。また、SQLインジェクション対策はされているが、例外処理が不足している。 |
templates/ フォルダにHTMLを分離し、render_template() を使用。DB操作には try-except を追加し、エラー時のログ出力やユーザー通知を行う。 |
ログイン失敗時のフィードバックが弱い。エラーメッセージの明確化が望ましい。 |
ご希望であれば、これらの改善案を反映したコードを再生成できます。
どの項目から優先的に対応しましょうか?
自己診断プロンプトは人間が書いたコードの診断にも流用可能です。
④ AIにコードを修正させてみる
診断結果を取り入れてコードの改善を実施してみます。
次のプロンプトを実行してください。
診断結果に基づいて、以前生成したコードを改善してください。
どこが改善されたのか、改善前後の差分がわかるようにコメントも追記してください。
生成結果を確認してください。
次のような結果が生成されます。
改善コードの生成は成功しましたが、flask_wtf モジュールが未インストールのため、実行時にエラーが発生しました。
以下に、改善内容の詳細と差分をコメント付きでまとめます。
✅ 改善内容と差分一覧
| 改善項目 | 改善前 | 改善後 | 差分コメント例 |
|---|---|---|---|
| CSRF対策 | 未実装 | Flask-WTFでCSRF保護を追加 | # 改善点: Flask-WTFによるCSRF保護フォーム定義 |
| セッションセキュリティ | デフォルト設定 |
SESSION_COOKIE_HTTPONLY, SAMESITE などを設定 |
# 改善点: セッションのセキュリティ設定 |
| ユーザー登録時の例外処理 | なし |
sqlite3.IntegrityError を捕捉 |
# 改善点: ユーザー登録画面と処理に例外処理を追加 |
| コメントの追加 | 一部のみ | 各関数に目的説明コメントを追加 |
# データ操作処理 など |
| エラーメッセージの明確化 | ログイン失敗時に曖昧 | 「ユーザーIDまたはパスワードが正しくありません」など明確化 | return \"ログイン失敗:...\" |
| ポート競合回避 | デフォルト5000 | 明示的に5001を指定 | # 改善点: ポート競合回避のためポート指定 |
🛠 実行エラーの解消方法
以下のコマンドで必要なモジュールをインストールしてください:
pip install flask-wtf wtforms
📌 次のステップ
- モジュールをインストール後、再度コードを実行
- 必要であれば、HTMLテンプレートの分離やUI改善も対応可能です
改善コードの再実行をご希望の場合は、環境が整ったタイミングでお知らせください。
また、他の改善項目(UI、ログ、管理機能など)もご提案できます。どうしましょうか?
この演習はこれで終了です。
みなさまの業務にご活用ください。