# Traceback (most recent call last):# File "app.py", line 10, in <module># db = sqlite3.connect("nonexistent.db")# sqlite3.OperationalError: unable to open database file# 请解释原因并提供解决方案
这种能力特别适合开源项目维护者快速生成文档。---
## 五、项目重构:Copilot 如何助力大规模代码演进重构是提升代码质量的关键步骤,但往往耗时且风险高。Copilot可以在以下方面提供支持:### 1. 函数拆分(Extract Method)假设你有一个过长的函数:```pythondef process_orders(orders):# 步骤 1:验证订单valid_orders= []
for order in orders:iforder.get("status")=="pending"andorder.get("amount",0)>0:valid_orders.append(order)# 步骤 2:计算税费taxed_orders= []
for order in valid_orders:tax=order["amount"]*0.1order["tax"]=taxorder["total"]=order["amount"]+taxtaxed_orders.append(order)# 步骤 3:保存到数据库for order in taxed_orders:save_to_db(order)returntaxed_orders
defvalidate_orders(orders: list[dict]) -> list[dict]:
return [
order for order in orders
if order.get("status") == "pending"and order.get("amount", 0) > 0
]
defcalculate_tax(orders: list[dict]) -> list[dict]:
taxed = []
for order in orders:
tax = order["amount"] * 0.1
order = order.copy() # 避免修改原数据
order.update({"tax": tax, "total": order["amount"] + tax})
taxed.append(order)
return taxed
defsave_orders(orders: list[dict]):
for order in orders:
save_to_db(order)
defprocess_orders(orders: list[dict]) -> list[dict]:
valid = validate_orders(orders)
taxed = calculate_tax(valid)
save_orders(taxed)
return taxed
改进点:
单一职责
可测试性增强
使用 copy() 避免副作用
2. 类设计重构
原始代码使用全局函数管理用户状态:
users = []
defadd_user(name, email):
users.append({"name": name, "email": email})
deffind_user_by_email(email):
for user in users:
if user["email"] == email:
return user
returnNone
你写注释:
# 将上述逻辑重构为 UserManager 类,支持添加、查找、列出用户
Copilot 输出:
classUserManager:
def__init__(self):
self.users: list[dict] = []
defadd_user(self, name: str, email: str) -> None:
self.users.append({"name": name, "email": email})
deffind_user_by_email(self, email: str) -> dict | None:
for user inself.users:
if user["email"] == email:
return user
returnNonedeflist_users(self) -> list[dict]:
returnself.users.copy()
提示:Copilot 甚至知道返回 copy() 以防止外部修改内部状态!
3. 异步化改造
你想将同步的数据库查询改为异步:
# 将以下同步函数改为使用 async/await 和 aiosqlitedefget_user(user_id):
conn = sqlite3.connect("app.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))
return cursor.fetchone()
Copilot 可能生成:
import aiosqlite
asyncdefget_user(user_id: int) -> tuple | None:
asyncwith aiosqlite.connect("app.db") as db:
asyncwith db.execute("SELECT * FROM users WHERE id = ?", (user_id,)) as cursor:
returnawait cursor.fetchone()