开发示例

🐍 Python 项目开发

用 Trae 开发 Python 项目,从 Flask API 到数据处理脚本,AI 全程辅助。

环境配置

Terminal — 创建虚拟环境
# 创建项目
mkdir my-python-app && cd my-python-app
python -m venv venv

# 激活虚拟环境
source venv/bin/activate      # macOS/Linux
venv\Scripts\activate         # Windows

# 在 Trae 中打开(会自动检测虚拟环境)
trae .

示例一:Flask REST API

完整的用户管理 API

Flask + SQLite
requirements.txt
flask==3.0.0
flask-cors==4.0.0
app.py
from flask import Flask, jsonify, request, abort
from flask_cors import CORS
import sqlite3, hashlib, os

app = Flask(__name__)
CORS(app)
DB = 'users.db'

def get_db():
    conn = sqlite3.connect(DB)
    conn.row_factory = sqlite3.Row
    return conn

def init_db():
    with get_db() as db:
        db.execute('''CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            email TEXT UNIQUE NOT NULL,
            created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
        )''')

@app.route('/api/users', methods=['GET'])
def list_users():
    page = request.args.get('page', 1, type=int)
    per_page = request.args.get('per_page', 10, type=int)
    search = request.args.get('q', '')
    offset = (page - 1) * per_page

    with get_db() as db:
        query = 'SELECT * FROM users WHERE name LIKE ? OR email LIKE ?'
        pattern = f'%{search}%'
        users = db.execute(query + ' LIMIT ? OFFSET ?',
                            [pattern, pattern, per_page, offset]).fetchall()
        total = db.execute('SELECT COUNT(*) FROM users WHERE name LIKE ? OR email LIKE ?',
                            [pattern, pattern]).fetchone()[0]

    return jsonify({
        'data': [dict(u) for u in users],
        'total': total, 'page': page, 'per_page': per_page
    })

@app.route('/api/users', methods=['POST'])
def create_user():
    data = request.get_json() or {}
    name = data.get('name', '').strip()
    email = data.get('email', '').strip()

    if not name or not email:
        abort(400, 'name 和 email 不能为空')

    try:
        with get_db() as db:
            cur = db.execute('INSERT INTO users (name, email) VALUES (?, ?)', [name, email])
            user = db.execute('SELECT * FROM users WHERE id = ?', [cur.lastrowid]).fetchone()
        return jsonify(dict(user)), 201
    except sqlite3.IntegrityError:
        abort(409, '邮箱已存在')

@app.errorhandler(400)
@app.errorhandler(404)
@app.errorhandler(409)
def handle_error(e):
    return jsonify({'error': e.description}), e.code

if __name__ == '__main__':
    init_db()
    app.run(debug=True, port=5000)
Terminal — 运行和测试
pip install -r requirements.txt
python app.py

# 测试 API
curl -X POST http://localhost:5000/api/users \
  -H "Content-Type: application/json" \
  -d '{"name":"张三","email":"zhangsan@example.com"}'

curl http://localhost:5000/api/users?q=张

示例二:数据处理脚本

data_processor.py
import csv, json
from pathlib import Path
from collections import defaultdict
from dataclasses import dataclass, asdict

@dataclass
class SalesRecord:
    product: str
    amount: float
    region: str
    month: str

def load_csv(path: str) -> list[SalesRecord]:
    records = []
    with open(path, encoding='utf-8') as f:
        for row in csv.DictReader(f):
            records.append(SalesRecord(
                product=row['product'],
                amount=float(row['amount']),
                region=row['region'],
                month=row['month']
            ))
    return records

def analyze(records: list[SalesRecord]) -> dict:
    by_region = defaultdict(float)
    by_product = defaultdict(float)
    for r in records:
        by_region[r.region] += r.amount
        by_product[r.product] += r.amount

    return {
        'total': sum(r.amount for r in records),
        'by_region': dict(sorted(by_region.items(), key=lambda x: -x[1])),
        'by_product': dict(sorted(by_product.items(), key=lambda x: -x[1])),
        'top_product': max(by_product, key=by_product.get)
    }

if __name__ == '__main__':
    records = load_csv('sales.csv')
    result = analyze(records)
    print(json.dumps(result, ensure_ascii=False, indent=2))
💡

在 Trae 中调试 Python 时,选中变量名按 Cmd/Ctrl + L,直接问 AI "这个变量的值是什么意思",比单纯看调试器更高效。