热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
本提示词专为Python开发者设计,提供专业级的代码审查与修复服务。通过深度分析代码结构,精准识别潜在错误、风格不一致和性能瓶颈问题,并给出具体修复建议和优化方案。具备多场景适配能力,支持从基础语法检查到复杂逻辑优化的全流程代码质量提升,帮助开发者快速提升代码健壮性和可维护性。
该代码包含多项高危安全问题,主要集中在命令执行、数据库访问、密码处理、反序列化及临时文件使用等环节。问题可导致远程命令执行、SQL注入、任意代码执行、凭证泄露、权限提升与信息泄露等严重风险。以下提供分级问题清单、可操作修复方案与一份重构示例代码。
严重
高 4) 弱密码哈希与敏感信息泄露
中 7) 异常被吞掉
低 10) 代码风格(PEP8) - 位置:import os, sqlite3, ... - 问题:多库同行导入,不符合 PEP8;部分命名不具语义 - 影响:可读性与一致性降低 11) 信息输出 - 位置:print('user:', user) - 问题:原样打印数据库记录 - 影响:潜在信息泄露(在日志/控制台)
命令执行
数据库访问与认证
反序列化
临时文件
异常与日志
输入与输出
代码风格与可维护性
安全基线
健壮性
可测试性
说明:
import json
import hmac
import hashlib
import logging
import secrets
import shlex
import sqlite3
import subprocess
import tempfile
from getpass import getpass
from typing import Optional, Tuple
# 日志基础配置(生产环境按需要调整 handler/formatter)
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# 仅允许声明好的备份动作,对应固定可执行文件与参数
ALLOWED_BACKUP_ACTIONS = {
"full": ["/usr/local/bin/safe_backup", "--full"],
"inc": ["/usr/local/bin/safe_backup", "--incremental"],
}
def run_backup(choice: str) -> None:
"""
仅允许调用白名单动作,禁用 shell。
"""
action = choice.strip().lower()
cmd = ALLOWED_BACKUP_ACTIONS.get(action)
if not cmd:
raise ValueError("invalid backup action")
# 绝对路径 + check + timeout,禁用 shell
result = subprocess.run(cmd, check=True, timeout=600, capture_output=True, text=True)
logger.info("backup finished: %s", result.stdout.strip())
def pbkdf2_hash_password(password: str, *, iterations: int = 200_000) -> Tuple[str, str, int]:
"""
基于 PBKDF2-SHA256 的口令派生;返回 (hex_hash, hex_salt, iterations)
"""
salt = secrets.token_bytes(16)
dk = hashlib.pbkdf2_hmac("sha256", password.encode("utf-8"), salt, iterations)
return dk.hex(), salt.hex(), iterations
def pbkdf2_verify_password(password: str, hex_hash: str, hex_salt: str, iterations: int) -> bool:
"""
常量时间比较,验证口令
"""
salt = bytes.fromhex(hex_salt)
dk = hashlib.pbkdf2_hmac("sha256", password.encode("utf-8"), salt, iterations)
return hmac.compare_digest(dk.hex(), hex_hash)
def load_user(name: str, password: str) -> Optional[Tuple[int, str]]:
"""
安全认证流程:
1) 参数化查询按用户名取回 hash/salt/迭代
2) 本地验证密码
3) 返回 (id, role)
需数据库列:id, name, role, pwd_hash, pwd_salt, pwd_iter
"""
sql = "SELECT id, role, pwd_hash, pwd_salt, pwd_iter FROM users WHERE name = ?"
try:
with sqlite3.connect("users.db", timeout=5) as conn:
conn.row_factory = sqlite3.Row
row = conn.execute(sql, (name,)).fetchone()
except sqlite3.Error as e:
logger.exception("database error")
raise
if not row:
return None
pwd_hash = row["pwd_hash"]
pwd_salt = row["pwd_salt"]
iterations = int(row["pwd_iter"])
if not pbkdf2_verify_password(password, pwd_hash, pwd_salt, iterations):
return None
return row["id"], row["role"]
def handle_payload_json(s: str):
"""
使用 JSON 解析不受信数据,并限制大小。
"""
if len(s) > 10_000: # 上限防止资源滥用,根据业务调优
raise ValueError("payload too large")
try:
return json.loads(s)
except json.JSONDecodeError as e:
raise ValueError("invalid JSON payload") from e
def write_temp(content: str) -> str:
"""
安全创建临时文件(0600),避免可预测路径与竞态。
"""
with tempfile.NamedTemporaryFile(mode="w", delete=False, encoding="utf-8", prefix="app_", suffix=".txt") as f:
f.write(content)
return f.name
def main():
try:
# 仅允许白名单备份动作(例如:full 或 inc)
backup_choice = input("backup action [full/inc]> ")
run_backup(backup_choice)
name = input("name: ")
pwd = getpass("pwd: ")
user = load_user(name, pwd)
if user is None:
print("authentication failed")
return
print("user:", {"id": user[0], "role": user[1]}) # 输出脱敏/最小化
payload_text = input("payload (json): ")
data = handle_payload_json(payload_text)
logger.info("payload accepted: type=%s", type(data).__name__)
path = write_temp("ok")
logger.info("wrote temp file: %s", path)
# 如果需要会话 token,请使用随机值而非密码派生
session_token = secrets.token_urlsafe(32)
logger.info("session started")
# 不要将 token 打印到终端或日志。这里只示例生成方式,不输出。
except subprocess.TimeoutExpired:
logger.error("backup timeout")
except subprocess.CalledProcessError:
logger.error("backup failed")
except Exception:
# 记录日志,避免向用户暴露敏感细节
logger.exception("unexpected error")
print("internal error")
if __name__ == "__main__":
main()
以上修改聚焦安全性与可维护性,避免了命令注入、SQL 注入与不安全反序列化等核心风险,并对口令保护、临时文件与可观测性进行了系统强化。
逻辑缺陷:count_errors 未正确累加
性能问题:正则在内层循环重复编译
性能问题:去重使用列表 in 判断
性能问题:手写冒泡排序
内存与I/O问题:一次性读入整文件
解析口径不一致导致结果不一致
代码重复扫描日志文件
取 Top N 的方式低效
解析正则未显式处理空白
文件编码与解码错误未控制
索引式循环可用直接迭代
缺少类型注解与文档字符串
未统一常量与命名规范
说明:
import re
from collections import Counter
from typing import Iterable, List, Optional, Tuple
# 预编译正则:匹配 "ERROR:" 后的有效信息,忽略其后空白
ERROR_RE = re.compile(r'ERROR:\s*(.+)')
def read_lines(path: str, encoding: str = 'utf-8') -> Iterable[str]:
"""
流式读取文件,避免一次性读入大文件。
"""
# 若日志存在非 UTF-8 字符,忽略解码错误以保证处理不中断
with open(path, encoding=encoding, errors='ignore') as f:
for line in f:
yield line
def parse_error(line: str) -> Optional[str]:
"""
从一行文本中解析错误信息。返回去除首尾空白的错误内容。
"""
m = ERROR_RE.search(line)
return m.group(1).strip() if m else None
def aggregate(paths: Iterable[str]) -> List[str]:
"""
返回按不区分大小写排序的唯一错误列表。
时间复杂度:O(N) 去重 + O(M log M) 排序(M为错误种类数)
"""
errors_set = set()
for p in paths:
for line in read_lines(p):
err = parse_error(line)
if err:
errors_set.add(err)
# 使用内置排序,按大小写不敏感排序,行为与原代码一致
return sorted(errors_set, key=str.lower)
def count_errors(paths: Iterable[str]) -> List[List[object]]:
"""
统计每类错误出现次数。
返回格式与原代码兼容:[[error, count], ...]
时间复杂度:O(N)
"""
counter = Counter()
for p in paths:
for line in read_lines(p):
err = parse_error(line)
if err:
counter[err] += 1
# 保持原返回格式(list[list]),便于与主程序兼容
return [[err, cnt] for err, cnt in counter.items()]
# 可选:单次扫描同时完成去重与计数,减少 I/O
def scan_errors(paths: Iterable[str]) -> Tuple[List[str], Counter]:
"""
单次遍历所有文件,返回:
- unique_errors: 按大小写不敏感排序的唯一错误列表
- counter: 错误计数 Counter
"""
unique_set = set()
counter = Counter()
for p in paths:
for line in read_lines(p):
err = parse_error(line)
if err:
unique_set.add(err)
counter[err] += 1
unique_errors = sorted(unique_set, key=str.lower)
return unique_errors, counter
def main() -> None:
paths = ['app1.log', 'app2.log']
# 方案A:与原主流程保持一致的调用方式
unique = aggregate(paths)
counts = count_errors(paths)
print('unique', len(unique))
# 更高效的 TOP N 获取方式(将 list 转回 Counter 使用 most_common)
top = Counter({k: v for k, v in counts}).most_common(5)
print('top', top)
# 方案B:一次扫描完成(如需进一步降低 I/O)
# unique2, counter2 = scan_errors(paths)
# print('unique', len(unique2))
# print('top', counter2.most_common(5))
if __name__ == '__main__':
main()
说明与验证要点:
建议的进一步测试与验证:
order.__init__(items=[]) 与 load_data(fp, cache={}) 使用可变默认值,会导致跨调用共享状态。calcTotal 和 apply_discount 使用 float 进行金额与税费计算,存在精度与舍入风险。get_userId 使用裸 except,会吞掉所有异常,不利于定位与安全。apply_discount 在 return 后存在 print('discount applied'),永不执行。apply_discount 中 if total > 1000 与 else 分支计算公式一致(rate + 0.0 与 rate 等价),阈值判断不起作用。CapWords(order 应为 Order)。calcTotal、get_userId)。Items 应为 items)。add 使用字典键 'n'/'p'/'q' 缩写,可读性与可维护性较差。cap=9999999 与阈值 1000 未抽象为常量或文档说明。created_at 使用字符串,建议使用 datetime。_cache_total 从未被读取或更新。load_data 未指定编码与异常处理;缓存策略依赖参数默认值,存在隐性共享。total = total + it['p'] * it['q'] 可用 sum(...) 简化。items=[]、cache={} 改为 None,在函数体内初始化。decimal.Decimal 并统一舍入规则:
money() 函数进行“两位小数、四舍五入”。get_userId 捕获 ValueError、TypeError,避免裸 except。apply_discount 中的 print 或移至返回前并改为日志。Order、方法名 calc_total、get_user_id、属性名 items。dataclass 定义 OrderItem,字段命名完整,如 name/price/qty。TAX_RATE 保留;为折扣上限、阈值等定义常量或参数。utf-8;可选传入缓存对象而非默认共享;必要时添加异常处理。_cache_total 可移除;如要缓存,需在 add 时失效并在计算后更新。sum 内生成式代替循环累加。functools.lru_cache 或模块级缓存替代参数缓存,避免重复IO。Decimal 与量化,避免浮点误差。dataclasses 管理订单项,减少字典键错误风险。print。以下示例实现上述修复与优化建议,保持原有业务行为(含保留负总额返回0的逻辑),并符合PEP8与常见最佳实践。
from __future__ import annotations
from dataclasses import dataclass
from datetime import datetime
from decimal import Decimal, ROUND_HALF_UP, getcontext
from typing import Any, Dict, Iterable, Optional
# 设置Decimal精度
getcontext().prec = 28
# 常量定义
TAX_RATE = Decimal("0.13")
DEFAULT_DISCOUNT_RATE = Decimal("0.05")
def to_decimal(value: Any) -> Decimal:
"""
将输入转换为Decimal。使用str避免float的二进制表示误差。
"""
return Decimal(str(value))
def money(value: Decimal) -> Decimal:
"""
统一金额量化到两位小数,四舍五入。
"""
return value.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
@dataclass(frozen=True)
class OrderItem:
name: str
price: Decimal
qty: int = 1
class Order:
def __init__(
self,
items: Optional[list[OrderItem]] = None,
created_at: Optional[datetime] = None,
) -> None:
# 避免可变默认参数共享
self.items: list[OrderItem] = items[:] if items else []
# 使用datetime而非字符串
self.created_at: datetime = created_at or datetime.now()
def add(self, name: str, price: float | str | Decimal, qty: int = 1) -> None:
"""
添加订单项,价格统一转换为Decimal。
"""
self.items.append(OrderItem(name=name, price=to_decimal(price), qty=qty))
def calc_total(self, tax: bool = True) -> Decimal:
"""
计算订单总价,可选是否包含税费。
"""
subtotal = sum(item.price * item.qty for item in self.items)
if tax:
subtotal *= (Decimal("1") + TAX_RATE)
return money(subtotal)
def normalize_rate(rate: float | Decimal) -> Decimal:
"""
归一化折扣率:
- 输入>1视为百分比(如10->0.10)
- 输入<=1视为小数(如0.1)
- 限定到[0, 1]区间
"""
r = to_decimal(rate)
if r > 1:
r = r / Decimal("100")
if r < 0:
r = Decimal("0")
if r > 1:
r = Decimal("1")
return r
def apply_discount(
total: float | Decimal,
rate: float | Decimal = DEFAULT_DISCOUNT_RATE,
cap: Optional[float | Decimal] = None,
) -> Decimal:
"""
应用折扣:
- total<0 时返回0(保持原逻辑)
- 支持小数或百分比折扣率
- 可选折扣封顶cap
"""
t = to_decimal(total)
if t < 0:
return Decimal("0.00")
r = normalize_rate(rate)
discount = t * r
if cap is not None:
discount = min(discount, to_decimal(cap))
return money(t - discount)
def load_data(fp: str, cache: Optional[Dict[str, list[str]]] = None) -> list[str]:
"""
读取文件内容(逐行),支持外部传入缓存。
"""
cache = cache or {}
if fp in cache:
return cache[fp]
# 指定编码,避免平台差异
with open(fp, encoding="utf-8") as f:
data = f.read().splitlines()
cache[fp] = data
return data
def get_user_id(user: Dict[str, Any]) -> Optional[int]:
"""
尝试从字典中读取id并转换为int,异常范围收窄。
"""
value = user.get("id")
try:
return int(value) if value is not None else None
except (ValueError, TypeError):
return None
def process(orders: Iterable[Order]) -> Decimal:
"""
处理订单集合,计算总金额并应用折扣。
"""
total = Decimal("0")
for o in orders:
ot = o.calc_total(tax=True)
total += apply_discount(ot, rate=Decimal("0.10"), cap=Decimal("500"))
return money(total)
def main() -> None:
o = Order()
o.add("USB", "19.90", 2)
o.add("Book", "45.00", 1)
print(process([o]))
if __name__ == "__main__":
main()
说明:
Decimal,并通过 money() 保证输出两位小数的四舍五入。apply_discount 的无效分支与不可达代码,保留原逻辑中“负总额返回0”的行为。OrderItem 使用数据类,减少键名错误与提升结构清晰度。此外可选改进(不改变当前行为):
functools.lru_cache 包装纯函数读取逻辑,或模块级缓存字典,并提供明确的失效策略。以“Python代码审查与修复助手”为核心,面向企业与个人开发者,打造一款即插即用的专业审查工具,帮助用户在编码、提交、合并与发布各环节快速提升代码质量与效率。核心目标:
在迭代中快速自检代码与风格,一次扫描定位逻辑缺陷与异常边界,拿到可直接应用的修复片段,缩短评审与回归时间。
审查ETL脚本与数据处理流程,优化高耗时环节与内存使用,减少任务失败与重跑,保障数据产出按时稳定。
统一编码标准与审查口径,批量生成模块级问题清单和优先级,制定渐进式重构计划,持续压降技术债务。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
免费获取高级提示词-优惠即将到期