25.2 程式碼生成與補全
程式碼生成與補全概述
Claude Code 提供了強大的程式碼生成與補全功能,可以根據自然語言描述、程式碼片段、API 規範等生成高質量的程式碼,並智慧補全未完成的程式碼。
代码生成
1. 从自然语言生成代码
示例:从自然语言生成代码
使用者請求: "建立一個使用者認證系統,支援註冊、登入、密碼重置功能"
Claude Code 生成的程式碼:
python
python
````python
> - 用户注册功能
> - 用户登录功能
> - JWT 认证
> - 密码重置请求
> - 密码重置
> - 修改密码
> - 邮件发送
> - 数据验证
> - 错误处理
`yaml
openapi: 3.0.0
info:
title: Product API
version: 1.0.0
paths:
/products:
get:
summary: Get all products
parameters:
- name: page
in: query
schema:
type: integer
- name: per_page
in: query
schema:
type: integer
responses:
'200':
description: Success
content:
application/json:
schema:
type: object
properties:
products:
type: array
items:
$ref: '#/components/schemas/Product'
total:
type: integer
page:
type: integer
post:
summary: Create a product
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ProductCreate'
responses:
'201':
description: Created
content:
application/json:
schema:
$ref: '#/components/schemas/Product'
/products/{product_id}:
get:
summary: Get a product
parameters:
- name: product_id
in: path
required: true
schema:
type: integer
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Product'
put:
summary: Update a product
parameters:
- name: product_id
in: path
required: true
schema:
type: integer
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ProductUpdate'
responses:
'200':
description: Success
content:
application/json:
schema:
$ref: '#/components/schemas/Product'
delete:
summary: Delete a product
parameters:
- name: product_id
in: path
required: true
schema:
type: integer
responses:
'204':
description: No content
components:
schemas:
Product:
type: object
properties:
id:
type: integer
name:
type: string
description:
type: string
price:
type: number
stock:
type: integer
category:
type: string
created_at:
type: string
format: date-time
updated_at:
type: string
format: date-time
ProductCreate:
type: object
required:
- name
- price
- stock
- category
properties:
name:
type: string
description:
type: string
price:
type: number
stock:
type: integer
category:
type: string
ProductUpdate:
type: object
properties:
name:
type: string
description:
type: string
price:
type: number
stock:
type: integer
category:
type: string
python
from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
from typing import Optional
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///products.db'
db = SQLAlchemy(app)
class Product(db.Model):
"""商品模型"""
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(200), nullable=False)
description = db.Column(db.Text)
price = db.Column(db.Float, nullable=False)
stock = db.Column(db.Integer, nullable=False)
category = db.Column(db.String(100), nullable=False)
created_at = db.Column(db.DateTime, default=datetime.utcnow)
updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
def to_dict(self):
"""转换为字典"""
return {
'id': self.id,
'name': self.name,
'description': self.description,
'price': self.price,
'stock': self.stock,
'category': self.category,
'created_at': self.created_at.isoformat(),
'updated_at': self.updated_at.isoformat()
}
@app.route('/products', methods=['GET'])
def get_products():
"""获取所有商品"""
page = request.args.get('page', 1, type=int)
per_page = request.args.get('per_page', 20, type=int)
pagination = Product.query.paginate(page=page, per_page=per_page)
return jsonify({
'products': [product.to_dict() for product in pagination.items],
'total': pagination.total,
'page': page
})
@app.route('/products', methods=['POST'])
def create_product():
"""创建商品"""
data = request.get_json()
# 验证必填字段
required_fields = ['name', 'price', 'stock', 'category']
for field in required_fields:
if field not in data:
return jsonify({'error': f'Missing required field: {field}'}), 400
# 验证数据类型
if not isinstance(data['price'], (int, float)) or data['price'] < 0:
return jsonify({'error': 'Price must be a positive number'}), 400
if not isinstance(data['stock'], int) or data['stock'] < 0:
return jsonify({'error': 'Stock must be a non-negative integer'}), 400
# 创建商品
product = Product(
name=data['name'],
description=data.get('description'),
price=data['price'],
stock=data['stock'],
category=data['category']
)
db.session.add(product)
db.session.commit()
return jsonify(product.to_dict()), 201
@app.route('/products/<int:product_id>', methods=['GET'])
def get_product(product_id):
"""获取商品详情"""
product = Product.query.get_or_404(product_id)
return jsonify(product.to_dict())
@app.route('/products/<int:product_id>', methods=['PUT'])
def update_product(product_id):
"""更新商品"""
product = Product.query.get_or_404(product_id)
data = request.get_json()
# 更新字段
if 'name' in data:
product.name = data['name']
if 'description' in data:
product.description = data['description']
if 'price' in data:
if not isinstance(data['price'], (int, float)) or data['price'] < 0:
return jsonify({'error': 'Price must be a positive number'}), 400
product.price = data['price']
if 'stock' in data:
if not isinstance(data['stock'], int) or data['stock'] < 0:
return jsonify({'error': 'Stock must be a non-negative integer'}), 400
product.stock = data['stock']
if 'category' in data:
product.category = data['category']
product.updated_at = datetime.utcnow()
db.session.commit()
return jsonify(product.to_dict())
@app.route('/products/<int:product_id>', methods=['DELETE'])
def delete_product(product_id):
"""删除商品"""
product = Product.query.get_or_404(product_id)
db.session.delete(product)
db.session.commit()
return '', 204
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True)
> **生成的代码包含**:
> - 完整的 CRUD 操作
> - 数据验证
> - 分页功能
> - 错误处理
> - 符合 OpenAPI 规范
## 代码补全
### 1. 智能方法补全
````python
class OrderService:
def __init__(self, db):
self.db = db
def create_order(self, user_id, items):
"""
创建订单
参数:
user_id: 用户 ID
items: 商品列表 [{'product_id': 1, 'quantity': 2}, ...]
返回:
订单对象
"""
# 验证用户
user = self.db.session.query(User).filter_by(id=user_id).first()
if not user:
raise UserNotFoundError(f"User with id {user_id} not found")
# 验证商品
product_ids = [item['product_id'] for item in items]
products = self.db.session.query(Product).filter(
Product.id.in_(product_ids)
).all()
product_map = {product.id: product for product in products}
for item in items:
if item['product_id'] not in product_map:
raise ProductNotFoundError(
f"Product with id {item['product_id']} not found"
)
product = product_map[item['product_id']]
if product.stock < item['quantity']:
raise InsufficientStockError(
f"Insufficient stock for product {product.name}"
)
# 计算总金额
total_amount = sum(
product_map[item['product_id']].price * item['quantity']
for item in items
)
# 创建订单
order = Order(
user_id=user_id,
total_amount=total_amount,
status='pending'
)
self.db.session.add(order)
self.db.session.flush()
# 创建订单项
for item in items:
product = product_map[item['product_id']]
order_item = OrderItem(
order_id=order.id,
product_id=item['product_id'],
quantity=item['quantity'],
price=product.price
)
self.db.session.add(order_item)
# 扣减库存
product.stock -= item['quantity']
self.db.session.commit()
return order
def get_order(self, order_id):
"""获取订单详情"""
order = self.db.session.query(Order).filter_by(id=order_id).first()
if not order:
raise OrderNotFoundError(f"Order with id {order_id} not found")
return order
def update_order_status(self, order_id, status):
"""更新订单状态"""
order = self.get_order(order_id)
order.status = status
order.updated_at = datetime.utcnow()
self.db.session.commit()
return order
def cancel_order(self, order_id):
"""取消订单"""
order = self.get_order(order_id)
if order.status in ['paid', 'shipped', 'completed']:
raise InvalidOrderStatusError(
f"Cannot cancel order with status {order.status}"
)
# 恢复库存
for item in order.items:
product = self.db.session.query(Product).filter_by(
id=item.product_id
).first()
if product:
product.stock += item.quantity
order.status = 'cancelled'
order.updated_at = datetime.utcnow()
self.db.session.commit()
return order
def get_user_orders(self, user_id, page=1, per_page=20):
"""获取用户订单列表"""
pagination = self.db.session.query(Order).filter_by(
user_id=user_id
).order_by(
Order.created_at.desc()
).paginate(page=page, per_page=per_page)
return pagination
```> **補全的內容**:
> - 完整的方法實現
> - 資料驗證
> - 錯誤處理
> - 庫存管理
> - 相關方法補全
```
### 2. 智能类补全
# 示例:智能类补全
用户输入:
````python
`python
class UserRepository:
def __init__(self, db):
self.db = db
```> Claude Code 自动补全:
```
python
from typing import List, Optional
from datetime import datetime
class UserRepository:
"""使用者倉儲類"""
def __init__(self, db):
self.db = db
def find_by_id(self, user_id: int) -> Optional[User]:
"""根據 ID 查詢使用者"""
return self.db.session.query(User).filter_by(id=user_id).first()
def find_by_username(self, username: str) -> Optional[User]:
"""根據使用者名稱查詢使用者"""
return self.db.session.query(User).filter_by(username=username).first()
def find_by_email(self, email: str) -> Optional[User]:
"""根據郵箱查詢使用者"""
return self.db.session.query(User).filter_by(email=email).first()
def find_all(self, page: int = 1, per_page: int = 20):
"""查詢所有使用者"""
return self.db.session.query(User).paginate(
page=page,
per_page=per_page
)
def create(self, user: User) -> User:
"""建立使用者"""
self.db.session.add(user)
self.db.session.commit()
return user
def update(self, user: User) -> User:
"""更新使用者"""
user.updated_at = datetime.utcnow()
self.db.session.commit()
return user
def delete(self, user_id: int) -> bool:
"""刪除使用者"""
user = self.find_by_id(user_id)
if not user:
return False
self.db.session.delete(user)
self.db.session.commit()
return True
def exists_by_username(self, username: str) -> bool:
"""檢查使用者名稱是否存在"""
return self.db.session.query(User).filter_by(
username=username
).first() is not None
def exists_by_email(self, email: str) -> bool:
"""檢查郵箱是否存在"""
return self.db.session.query(User).filter_by(
email=email
).first() is not None
def count(self) -> int:
"""統計使用者數量"""
return self.db.session.query(User).count()
def search(self, keyword: str, page: int = 1, per_page: int = 20):
"""搜尋使用者"""
return self.db.session.query(User).filter(
User.username.ilike(f'%{keyword}%') |
User.email.ilike(f'%{keyword}%')
).paginate(page=page, per_page=per_page)
> **補全的內容**:
> - 完整的 CRUD 方法
> - 查詢方法
> - 存在性檢查
> - 搜尋功能
> - 分頁支援