From python-skills
在简化或重构 Python 代码,且存在重复逻辑、深层嵌套、冗长分支或无意义中间变量,同时必须保持行为不变时使用此 skill。
npx claudepluginhub zengbin93/python_coding_skills --plugin python-skillsThis skill uses the workspace's default tool permissions.
当 Python 代码的可读性、层次结构或重复度已经影响理解和维护,但又不能改变既有行为时,使用此 skill。
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Analyzes BMad project state from catalog CSV, configs, artifacts, and query to recommend next skills or answer questions. Useful for help requests, 'what next', or starting BMad.
当 Python 代码的可读性、层次结构或重复度已经影响理解和维护,但又不能改变既有行为时,使用此 skill。
目标不是“写得更短”,而是在完全保留原有功能、输出、副作用、异常行为和公开接口的前提下,降低复杂度、提升可读性,并让后续修改更安全。
在出现以下一种或多种情况时使用:
if/elif 分支链很长,且大多是值分发以下情况不要使用此 skill 作为主要指导:
除非用户明确要求,否则重构时必须保持以下内容不变:
python-code-quality:负责格式化、lint、类型检查和基础规范python-best-practices:负责更广义的 Python 设计、性能、数据结构和并发建议python-code-review:负责整体质量审查与提交前检查python-simplifier:专注于在不改变行为的前提下降低复杂度、消除重复、提升可读性ruff 和 basedpyright 验证结果。仅当重复逻辑在语义上确实相同,而不只是“看起来像”时,才进行提取。
# ❌ 重复代码
def process_admin(user):
if not user.get("name"):
raise ValueError("名称不能为空")
if len(user["name"]) > 50:
raise ValueError("名称过长")
# admin 逻辑...
def process_member(user):
if not user.get("name"):
raise ValueError("名称不能为空")
if len(user["name"]) > 50:
raise ValueError("名称过长")
# member 逻辑...
# ✅ 提取公共验证
def validate_user_name(user: dict) -> None:
if not user.get("name"):
raise ValueError("名称不能为空")
if len(user["name"]) > 50:
raise ValueError("名称过长")
def process_admin(user: dict) -> None:
validate_user_name(user)
# admin 逻辑...
def process_member(user: dict) -> None:
validate_user_name(user)
# member 逻辑...
如果多个函数只有输入常量不同,而流程完全一致,可以考虑参数化。
# ❌ 相似的多个函数
def send_welcome_email(user_email: str) -> None:
subject = "欢迎加入!"
body = "感谢您的注册..."
_send_email(user_email, subject, body)
def send_reset_email(user_email: str) -> None:
subject = "密码重置"
body = "点击链接重置密码..."
_send_email(user_email, subject, body)
# ✅ 统一函数 + 枚举
from enum import Enum
class EmailTemplate(Enum):
WELCOME = ("欢迎加入!", "感谢您的注册...")
RESET = ("密码重置", "点击链接重置密码...")
def send_email(user_email: str, template: EmailTemplate) -> None:
subject, body = template.value
_send_email(user_email, subject, body)
当每个失败条件都能自然提前退出时,优先用 Guard Clause 展开主流程。
# ❌ 深层嵌套(箭头形代码)
def process_order(order):
if order is not None:
if order.is_valid():
if order.user.is_active():
if order.items:
return fulfill_order(order)
return None
# ✅ 提前返回(Guard Clause)
def process_order(order: Order | None) -> OrderResult | None:
if order is None:
return None
if not order.is_valid():
return None
if not order.user.is_active():
return None
if not order.items:
return None
return fulfill_order(order)
适用于“输入值 -> 输出值”的简单映射;如果分支里还有校验、副作用或多步逻辑,就不要强行替换。
# ❌ 冗长的 if-elif 链
def get_status_label(status: str) -> str:
if status == "pending":
return "待处理"
elif status == "processing":
return "处理中"
elif status == "completed":
return "已完成"
elif status == "cancelled":
return "已取消"
else:
return "未知"
# ✅ 字典映射
STATUS_LABELS: dict[str, str] = {
"pending": "待处理",
"processing": "处理中",
"completed": "已完成",
"cancelled": "已取消",
}
def get_status_label(status: str) -> str:
return STATUS_LABELS.get(status, "未知")
当你表达的是结构化模式匹配,而不仅仅是简单值映射时,match-case 会更清晰。
# ✅ 使用 match-case
def handle_event(event: dict) -> str:
match event["type"]:
case "click":
return handle_click(event)
case "hover":
return handle_hover(event)
case "submit":
return handle_submit(event)
case _:
return handle_unknown(event)
推导式适合表达简单、线性的转换。过长或多层嵌套的推导式反而会降低可读性。
# ❌ 命令式循环
result = []
for item in items:
if item.is_active():
result.append(item.name.upper())
# ✅ 列表推导式
result = [item.name.upper() for item in items if item.is_active()]
# 字典推导式
user_map = {user.id: user.name for user in users}
# 集合推导式
unique_tags = {tag for item in items for tag in item.tags}
当 sum、any、all、max 等内置函数能够更直接表达意图时,优先使用它们。
# ❌ 手动循环
total = 0
for price in prices:
total += price
has_admin = False
for user in users:
if user.role == "admin":
has_admin = True
break
# ✅ 内置函数
total = sum(prices)
has_admin = any(user.role == "admin" for user in users)
all_active = all(user.is_active() for user in users)
max_price = max(prices, default=0)
只有在中间变量没有承载领域语义、也不利于调试时,才考虑删除。
# ❌ 多余的中间赋值
def is_valid_age(age: int) -> bool:
result = age >= 0 and age <= 150
return result
# ✅ 直接返回
def is_valid_age(age: int) -> bool:
return 0 <= age <= 150
适用于以数据承载为主的类;如果类包含复杂不变量、构造规则或行为逻辑,就不要机械替换。
# ❌ 样板代码过多
class Point:
def __init__(self, x: float, y: float):
self.x = x
self.y = y
def __repr__(self):
return f"Point(x={self.x}, y={self.y})"
def __eq__(self, other):
return self.x == other.x and self.y == other.y
# ✅ 使用 dataclass
from dataclasses import dataclass
@dataclass
class Point:
x: float
y: float
| 合并字典(Python 3.9+)在目标 Python 版本允许的前提下,优先选择更清晰的现代语法。
# ❌ 旧方式
merged = {**defaults, **overrides}
# ✅ 更清晰的方式
merged = defaults | overrides
用命名常量、枚举或语义化配置替代含义不明的数字和字符串。
# ❌ 含义不明的数字和字符串
if status == 2:
send_alert()
if response.status_code == 429:
time.sleep(60)
# ✅ 使用命名常量或枚举
from enum import IntEnum
class OrderStatus(IntEnum):
PENDING = 1
CONFIRMED = 2
SHIPPED = 3
RATE_LIMIT_STATUS = 429
RATE_LIMIT_WAIT_SECONDS = 60
if status == OrderStatus.CONFIRMED:
send_alert()
if response.status_code == RATE_LIMIT_STATUS:
time.sleep(RATE_LIMIT_WAIT_SECONDS)
优先使用上下文管理器,减少资源泄漏风险,并让资源生命周期更明显。
# ❌ 手动资源管理
file = open("data.txt")
try:
content = file.read()
finally:
file.close()
# ✅ 使用 with 语句
with open("data.txt") as file:
content = file.read()
# 多个上下文管理器
with open("input.txt") as src, open("output.txt", "w") as dst:
dst.write(src.read())
if/elif 都改成字典。只要分支里有副作用、多步逻辑或校验,原写法可能更清晰。dataclass。行为型类和带不变量的类往往需要显式结构。match-case这些只是提醒你检查,不是自动改写规则。
在重构前后对照此清单:
识别重构机会:
保持行为一致:
重构后验证:
ruff format、ruff check 和 basedpyright 检查无报错好的 Python 简化,减少的是阅读和维护阻力,而不是信息量。
优先做显式、局部、可证明安全的重构,让下一位读代码的人更快理解,也更不容易改坏。