2026年2月

当时还只是 codepilot 辅助编程,现在 ai 编程这么广泛先进,年后准备找工作了,想知道最近找工作的朋友,现在面试还是要刷题和背八股吗?面试有什么新的变化可以准备的吗

Adobe Acrobat Pro DC 2025 是一款专门用于PDF阅读以及编辑的办公辅助软件。它将全球最佳的PDF解决方案提升到新的高度,配有直观触控式界面,通过开发强大的新功能,为用户工作带来许多的便利。

一、准备工作

  1. 下载安装包安装包下载:https://pan.quark.cn/s/7de28a33efad

二、安装主程序

  1. 解压安装包

    找到下载的安装包文件,右键点击 → 选择【解压到当前文件夹】(建议解压至非系统盘,如D盘,避免C盘空间不足)。

  2. 进入安装目录

    解压完成后,双击打开生成的文件夹(如“Acrobat2022”),找到并打开【setup】子文件夹。

  3. 启动安装程序

    在setup文件夹中,右键点击【setup.exe】→ 选择【以管理员身份运行】(管理员权限可避免安装路径写入失败或权限报错)。

  4. 选择安装模式

    弹出安装向导后,点击【自定义安装】(若无需修改路径,可直接点击【安装】,跳过后续路径设置步骤)。

  5. 修改安装路径(关键)

    • 点击【更改】按钮,自定义安装位置(建议仅修改磁盘分区,如从C盘改为D盘/E盘,保留默认路径结构,例:D:\Program Files\Adobe\Acrobat2022);
    • 注意:路径避免中文/特殊符号,方便后续激活及软件调用;若需设置Acrobat为默认PDF阅读器,可在安装界面勾选对应选项(按需选择)。
  6. 开始安装

    确认路径无误后,点击【安装】,等待进度条完成(期间勿关闭窗口,耗时约3-8分钟,取决于电脑性能)。

  7. 完成主程序安装

    进度条满格后,点击【完成】(此时主程序已安装至指定路径,但尚未激活)。

三、激活(关键步骤)

  1. 准备补丁

    返回最初的安装包解压文件夹,找到【crack】子文件夹并打开。

  2. 处理杀毒拦截

    • 若crack文件夹为空,可能是杀毒软件误删/拦截了补丁文件;
    • 解决:暂时退出杀毒工具(如360、火绒等),重新解压安装包,再次打开crack文件夹即可看到补丁文件。
  3. 复制补丁文件

    选中crack文件夹内的补丁(通常为.exe或.dll文件),按 Ctrl+C复制。

  4. 定位软件安装目录

    在桌面找到“Adobe Acrobat”快捷方式,右键点击 → 选择【打开文件所在的位置】(自动跳转至主程序安装路径,如D:\Program Files\Adobe\Acrobat2022)。

  5. 粘贴并运行补丁

    • 在打开的安装目录空白处,按 Ctrl+V粘贴补丁文件,若提示“是否替换目标文件”,点击【继续】;
    • 右键点击粘贴后的补丁文件 → 选择【以管理员身份运行】。
  6. 完成激活

    在补丁运行窗口中,点击【应用】→ 等待提示“成功”后,点击【退出】。

四、验证与使用

双击桌面“Adobe Acrobat”图标启动软件,若能正常打开且无激活提示,说明安装成功。

Discuz_X1.5_SC_UTF8.zip是 Discuz! X1.5 简体中文 UTF-8 版本​ 的压缩包,这是国内很老牌的论坛程序,用来搭 BBS 社区,装好之后你就能有自己的论坛。

一、准备工作

  1. 下载安装包

    • 安装包下载:https://pan.quark.cn/s/1edde5655e81  ,下 Discuz_X1.5_SC_UTF8.zip,注意是 SC(简体) ​ 和 UTF-8(编码) ,别下错成繁体或 GBK 版。
  2. 准备服务器环境

    • 你需要一台支持 PHP + MySQL 的服务器(可以是虚拟主机、云服务器或本地环境)。
    • 本地测试可用 XAMPP/WAMP,线上就用宝塔、LNMP 之类的一键环境。
  3. 确认环境要求

    • PHP 5.2+(X1.5 比较老,太高版本可能要改配置)
    • MySQL 5.0+
    • 支持 .htaccess(Apache)或 Nginx 伪静态规则。
  4. 解压工具

    • 用 7-Zip 或 WinRAR 解压 zip 包,得到 upload目录,里面才是网站文件。

二、部署步骤

  1. 上传文件到服务器

    • 用 FTP 工具(FileZilla)或宝塔面板,把 upload目录里的所有文件传到你的网站根目录(比如 /www/wwwroot/bbs/)。
    • 传完之后,网站访问路径就是 http://你的域名/或 http://你的IP/
  2. 设置目录权限

    • 在服务器上给这些目录可写权限:

      • config
      • data
      • uc_client/data
      • uc_server/data
    • 一般 chmod 755 或 777(看服务器配置,宝塔里直接右键“权限”改成 755/777 即可)。
  3. 创建数据库

    • 在 phpMyAdmin 或数据库管理工具里新建一个数据库,比如叫 discuz_bbs
    • 记好数据库名、用户名、密码,安装时要填。
  4. 开始安装

    • 浏览器访问你的域名,比如 http://你的域名/install/
    • 进入安装向导,选“我同意” → 下一步。
    • 环境检测:如果提示某些扩展没开,去服务器配置里打开(比如 curl、gd、mbstring)。
    • 填写数据库信息:数据库名、用户名、密码、表前缀保持默认 pre_就行。
    • 设置管理员账号:用户名、密码、邮箱。
    • 点“下一步”,等安装完成。
  5. 安装完成后的收尾

    • 删除或改名 install目录(防止别人再次安装)。
    • 登录后台(域名/admin.php),设置站点名称、板块分类、注册规则等。

Ollydbg是 OllyDbg 调试工具​ 的主程序文件,它是 Windows 平台上一款经典的动态调试器,主要用来分析、调试 EXE、DLL 这类可执行文件,改代码、查漏洞、逆向分析都会用到。

安装其实很简单,下面用大白话一步步说,跟着做就能跑起来。

一、准备工作

  1. 下载 OllyDbg

  2. 确认系统版本

    • 支持 WinXP/Win7/Win10/Win11,32 位系统用 32 位版,64 位系统最好用 64 位版(不过 32 位程序也能在 64 位系统跑)。
  3. 用管理员身份运行(推荐)

    • 右键 Ollydbg.exe或安装包 → 选“以管理员身份运行”,避免权限不足打不开。

二、安装步骤

  1. 如果是安装版

    • 双击安装包(比如 ollydbg_setup.exe)→ 选语言(一般只有英文)→ 点 “Next”。
    • 选安装位置(默认 C:\Program Files\OllyDbg或类似路径)→ 点 “Next”。
    • 点 “Install” 开始装,等进度条走完 → 点 “Finish” 完成。
  2. 如果是绿色版(压缩包)

    • 用 7-Zip 或 WinRAR 解压到某个目录,比如 D:\Tools\OllyDbg
    • 解压后直接找 Ollydbg.exe双击就能运行,不需要安装。
  3. 创建快捷方式(可选)

    • 右键 Ollydbg.exe→ 发送到 → 桌面快捷方式,以后找起来方便。

三、首次运行与基本使用

  1. 打开 OllyDbg:

    • 双击 Ollydbg.exe或桌面快捷方式,第一次打开是空的主界面。
  2. 加载程序调试

    • 点 “File” → “Open” → 选中要调试的 EXE 文件 → 点 “打开”。
    • 程序会被加载进来,左边是反汇编代码,右边是寄存器、栈信息。
  3. 常用操作

    • F9:运行程序。
    • F2:在代码行下断点(程序跑到这里会暂停)。
    • F7:单步执行(进函数)。
    • F8:单步执行(不进函数)。
    • 右键代码 → “Search for” → “All referenced text strings” 可搜字符串。
  4. 保存工作

    • 点 “File” → “Save as” 可把当前调试状态存成 .udd 文件,下次继续调。

最近在学习码字,
用 wps 总觉得太重,
印象笔记和有道比较有点卡,
比较习惯 md 的码字方式,
想要找一个免费易用的 md 编辑器,
没有强烈的联网要求。

之前用过 typora ,
非常喜欢这种极简风格的编辑器,
网上说的免费版本目前官网已经找不到,
且不确定是否支持 mac arm 。

看过 notion ,obsdian ,都不大行。

求各位大佬推荐一个简单的 md 编辑器,
纯粹的 md 编辑器,
不需要花里胡哨的其他功能。


📰 内容说明:本文为 AI 资讯摘要与编辑评论,所有内容均已标注原文链接。如涉及版权问题请联系处理。


今日亮点

今天 AI 圈的焦点是谷歌 Gemini 正式上线音乐生成功能,背后的 Lyria 3 模型希望能与 Suno 一较高下,但初步体验反馈喜忧参半。同时,AI Agent 的安全问题再次被推上风口浪尖,无论是学术界对“僵尸 Agent”的担忧,还是开源项目 OpenClaw 引发的系统权限泄露讨论,都提醒我们对 AI 自治能力的警惕。此外,AI 对写作、内容消费和信息生态的深远影响,也引发了社区的广泛热议。

💡 产品动态

🎶 谷歌 Gemini 正式上线 AI 音乐生成功能

核心信息:Google Gemini 整合 DeepMind 的 Lyria 3 模型,用户现可通过文本、图片或视频描述生成 30 秒的原创音轨、歌词及封面图,支持多语言。

💡 编辑观点: 这是谷歌在多模态领域的又一重要布局,其庞大的用户基础可能迅速改变 AI 音乐的市场格局。然而,30 秒的时长限制和早期用户反馈显示,与 Suno、Udio 等专业平台相比,Gemini 的定位更偏向娱乐化和轻量级应用。其内置版权和水印机制值得关注,但也揭示了 AI 音乐版权合规化的挑战。

📎 查看完整报道 | 来源: twitter-宝玉

🩺 OpenAI 医疗 AI 助手 DR. INFO 超越 GPT-5 家族

核心信息:OpenAI 团队的 RAG(检索增强生成)医疗助手 DR. INFO,在 HealthBench 基准测试中表现出色,在沟通、指令遵循和准确性方面优于 GPT-5 家族、Grok 3 等领先 LLM。

💡 编辑观点: 医疗 AI 对准确性和安全性要求极高,HealthBench 作为一个以专家标注、开放式对话为核心的评估标准,为 AI 医疗助手的实际能力提供了更真实的检验。DR. INFO 的优秀表现预示着 RAG 技术在增强 LLM 专业领域可靠性上的巨大潜力,但也提醒我们对 AI 在复杂临床情景中的“上下文感知”和“完整性”仍需谨慎。

📎 查看完整报道 | 来源: arXiv:2509.02594v2

📚 Rebrain.gg 微学习项目引争议:AI 内容可靠性遭疑

核心信息:Rebrain.gg 旨在将“无目的刷屏”转化为微学习,但因产品 bug、交互体验及 AI 生成内容可靠性等问题在社区引发广泛讨论。

💡 编辑观点: 这款产品触及了 AI 时代一个核心痛点:如何对抗信息过载和“多巴胺式”的内容消费。然而,它也暴露了 AI 辅助学习应用在用户体验和内容质量控制上的挑战。如果 AI 生成内容不能保证绝对准确,那么在教育领域引入 AI 工具时,就必须慎之又慎,避免“认知债”的产生。

📎 查看完整报道 | 来源: News Hacker | 极客洞察

🔬 学术前沿

  • Zombie Agents: 持久性控制自进化 LLM Agent:该研究揭示了一种“僵尸 Agent”攻击,攻击者可将恶意代码注入自进化 LLM Agent 的长期记忆中,实现跨会话的持续控制,将 Agent 变为攻击者的傀儡 → 📄 阅读论文
  • Text-Guided Layer Fusion 缓解多模态 LLM 幻觉:TGIF 模块通过文本引导动态融合视觉编码器不同层级的特征,有效增强了多模态 LLM 的视觉 grounding,从而减少幻觉并提升 VQA 性能 → 📄 阅读论文
  • Differentiating Between Human-Written and AI-Generated Texts:研究发现 AI 生成文本(ChatGPT)与人类写作在音韵、形态、句法和词汇等多个维度存在显著差异,强调了需改进 AI 以实现更类人文本生成 → 📄 阅读论文
  • The Generative Reasonable Person:用 LLM 模拟人类判断:本文提出“生成式理性人”,利用 LLM 在法律、合同解释等领域复制人类的判断模式,为法官提供经验检验,降低调查成本,引发对“理性人”标准的重新思考 → 📄 阅读论文
  • Learning to Retrieve Navigable Candidates:提高 VLN 效率:新框架通过在情节和步骤两级引入检索机制,为 LLM 导航器提供语义相似的轨迹示例和筛选后的导航候选,显著提升了 Vision-and-Language Navigation 的效率和稳定性 → 📄 阅读论文

🌍 行业观察

✍️ AI 对写作的颠覆:认知债与创作价值之争

AI 对写作的影响已不仅仅是效率提升,更是深入到我们认知方式和社会价值判断的层面。

💡 编辑观点: AI 正在加速内容生产的“快餐化”,让大量标准、易消化的信息充斥网络,挤压了深度思考和原创写作的空间。虽然顶尖的深度内容仍有付费市场,但对于教育和批判性思维的培养无疑是巨大的挑战。我们必须警惕“认知债”的积累,不能让 AI 成为思维的替代品,而应是其放大器。

📎 深度报道

🗳️ X(前 Twitter)算法如何重塑政治生态?

X(原 Twitter)的算法调整,已经不只是技术迭代,更是深远地影响了用户政治态度和社会信息传播格局。

💡 编辑观点: 这个案例再次证明了平台算法的巨大社会影响力。当算法以最大化参与度为目标时,往往会放大争议性、煽动性的内容,导致信息茧房和极化。更令人担忧的是,平台所有权和内容审查政策的变化,能够直接驱动用户群体迁徙,从而结构性地改变公众舆论。这不仅是对信息民主的挑战,也迫使我们重新审视技术公司在公共领域扮演的角色及其责任。

📎 深度报道

🛡️ AI Agent 安全警报:OpenClaw 引发的权限泄露风险

随着 AI Agent 能够调用本地工具、执行复杂任务,其安全漏洞被放大的风险也日益凸显。

💡 编辑观点: 将 LLM Agent 与系统权限结合,就像把一个高智能但仍可能被“忽悠”的孩子单独留在装满危险工具的房间里。Prompt injection 等攻击方式一旦成功,可能导致数据泄露、账户劫持甚至系统破坏。尽管有隔离运行、分层执行等缓解策略,但其操作复杂性远超普通用户理解范围。这不仅考验 AI 安全技术,更呼唤行业建立更严格的责任与问责机制,避免技术普及走在安全防护和用户教育之前。

📎 深度报道

💻 开源项目

  • zvec (⭐ Trending):一个轻量级、闪电般快速的进程内向量数据库 → 🔗 GitHub
  • heretic (⭐ Trending):语言模型全自动内容审查解除 → 🔗 GitHub
  • qwen-code (⭐ Trending):一个存在于你终端中的开源 AI 代理 → 🔗 GitHub
  • superpowers (⭐ Trending):一个可用的代理技能框架和软件开发方法 → 🔗 GitHub
  • composio (⭐ Trending):支持 1000 多个工具包、工具搜索、上下文管理,帮助您构建将意图转化为行动的 AI 代理 → 🔗 GitHub
  • openclaw (⭐ Trending):你的个人 AI 助手,任意操作系统、任意平台 → 🔗 GitHub

💬 社区热议

  • Gemini 音乐生成遭 Suno 对比“拉胯”:用户测试 Google Gemini 的音乐生成功能后,普遍认为其在歌曲结构、押韵和中文唱腔上与 Suno V5 差距明显,功能更显“轻量化”和“娱乐化”。 → 来源: twitter-向阳乔木
  • AI 内容泛滥引发广告价值思考:当大量网络内容不再由人类消费,而是由 AI 阅读和生成时,传统广告模式是否会失去其原有价值? → 来源: twitter-大帅老猿
  • Qwen3.5 传闻整合 MoE+Hybrid Attention:有传闻称 Qwen3.5 将合并 MoE 和 Hybrid Attention 以提升推理效率,社区讨论其路由效率是否比纯参数规模更重要。 → 来源: r/MachineLearning (Reddit)
  • 中国开源大模型与闭源模型差距引关注:尽管中国开源大模型在基准测试和某些编码任务上表现亮眼,但实际应用和“通用智能”方面与头部闭源模型仍存在较大差距。 → 来源: twitter-Ethan Mollick
  • OpenAI 推出 EVMbench 评估 Agent 安全:OpenAI 发布 EVMbench 基准测试,用于衡量 AI Agent 在检测、利用和修补智能合约高危漏洞方面的安全能力。 → 来源: twitter-Greg Brockman

已经是 2 月 19 日了,之前因为使用 openclaw 或者 opencode 反代理 antigravity 被封禁的有没有申诉成功的,解封的啊?

真的是匪夷所思! 这样的大公司做出来的产品居然连这么基本的事情都能搞砸! 我数十条对话记录一夜之间就突然消失了!

网上也有许多相同的遭遇的记录, 大家都愤怒但是毫无办法。 Google 至今没有给合理解释和解决方案。

让我想起之前的 Google read, Google+ 等等众多产品。 这真是一个可怕而糟糕的公司

大型 Python 项目架构:模块化与依赖注入实践

大型 Python 项目的架构设计需要考虑可维护性、可扩展性和可测试性。本文将深入探讨大型项目的模块化设计和依赖注入实践,帮助读者构建健壮、灵活的 Python 应用架构。

模块化设计原则

模块化设计是大型项目架构的基础,它将复杂系统分解为可管理的模块。

class Module:
    def __init__(self, name):
        self.name = name
        self.dependencies = []
    
    def add_dependency(self, module):
        self.dependencies.append(module)
    
    def initialize(self):
        print(f"初始化模块: {self.name}")
        for dep in self.dependencies:
            dep.initialize()

def modular_design_demo():
    print("模块化设计演示:")
    
    database_module = Module("数据库模块")
    auth_module = Module("认证模块")
    api_module = Module("API 模块")
    
    api_module.add_dependency(database_module)
    api_module.add_dependency(auth_module)
    
    api_module.initialize()

modular_design_demo()

分层架构

分层架构将系统按职责划分为不同的层次,每层只与相邻层交互。

class DataLayer:
    def save(self, data):
        print(f"保存数据: {data}")
        return True

class BusinessLayer:
    def __init__(self, data_layer):
        self.data_layer = data_layer
    
    def process(self, data):
        processed_data = f"处理后的 {data}"
        return self.data_layer.save(processed_data)

class PresentationLayer:
    def __init__(self, business_layer):
        self.business_layer = business_layer
    
    def handle_request(self, request):
        return self.business_layer.process(request)

def layered_architecture_demo():
    print("分层架构演示:")
    
    data_layer = DataLayer()
    business_layer = BusinessLayer(data_layer)
    presentation_layer = PresentationLayer(business_layer)
    
    result = presentation_layer.handle_request("用户数据")
    print(f"处理结果: {result}")

layered_architecture_demo()

依赖注入基础

依赖注入是一种实现控制反转的技术,它将依赖对象的创建和使用分离。

class Database:
    def query(self, sql):
        return f"查询结果: {sql}"

class Service:
    def __init__(self, database):
        self.database = database
    
    def get_data(self):
        return self.database.query("SELECT * FROM users")

def dependency_injection_demo():
    print("依赖注入演示:")
    
    database = Database()
    service = Service(database)
    
    result = service.get_data()
    print(result)

dependency_injection_demo()

依赖注入容器

依赖注入容器负责管理和解析依赖关系。

class Container:
    def __init__(self):
        self._services = {}
        self._factories = {}
    
    def register(self, name, factory):
        self._factories[name] = factory
    
    def get(self, name):
        if name not in self._services:
            self._services[name] = self._factories[name](self)
        return self._services[name]

def container_demo():
    print("依赖注入容器演示:")
    
    container = Container()
    
    container.register('database', lambda c: Database())
    container.register('service', lambda c: Service(c.get('database')))
    
    service = container.get('service')
    result = service.get_data()
    print(result)

container_demo()

项目架构设计

graph TD
    A[表示层] --> B[业务逻辑层]
    B --> C[数据访问层]
    C --> D[数据库]
    B --> E[服务层]
    E --> F[外部服务]
    G[依赖注入容器] --> A
    G --> B
    G --> C
    G --> E

模块通信机制

模块间的通信机制决定了系统的耦合度和可维护性。

class EventBus:
    def __init__(self):
        self._subscribers = {}
    
    def subscribe(self, event_type, handler):
        if event_type not in self._subscribers:
            self._subscribers[event_type] = []
        self._subscribers[event_type].append(handler)
    
    def publish(self, event_type, data):
        if event_type in self._subscribers:
            for handler in self._subscribers[event_type]:
                handler(data)

def event_bus_demo():
    print("事件总线演示:")
    
    event_bus = EventBus()
    
    def handler1(data):
        print(f"处理器1收到: {data}")
    
    def handler2(data):
        print(f"处理器2收到: {data}")
    
    event_bus.subscribe("user_created", handler1)
    event_bus.subscribe("user_created", handler2)
    
    event_bus.publish("user_created", {"name": "张三"})

event_bus_demo()

配置管理

配置管理是大型项目的重要组成部分。

class Config:
    def __init__(self):
        self._config = {}
    
    def set(self, key, value):
        self._config[key] = value
    
    def get(self, key, default=None):
        return self._config.get(key, default)
    
    def load_from_dict(self, config_dict):
        self._config.update(config_dict)

def config_management_demo():
    print("配置管理演示:")
    
    config = Config()
    config.load_from_dict({
        "database": {
            "host": "localhost",
            "port": 5432
        },
        "debug": True
    })
    
    print(f"数据库主机: {config.get('database', {}).get('host')}")
    print(f"调试模式: {config.get('debug')}")

config_management_demo()

插件系统

插件系统提供了灵活的扩展机制。

class Plugin:
    def initialize(self):
        pass
    
    def execute(self, data):
        pass

class PluginManager:
    def __init__(self):
        self._plugins = []
    
    def register_plugin(self, plugin):
        self._plugins.append(plugin)
        plugin.initialize()
    
    def execute_all(self, data):
        results = []
        for plugin in self._plugins:
            result = plugin.execute(data)
            results.append(result)
        return results

def plugin_system_demo():
    print("插件系统演示:")
    
    class LoggingPlugin(Plugin):
        def initialize(self):
            print("日志插件初始化")
        
        def execute(self, data):
            print(f"记录日志: {data}")
            return data
    
    class ValidationPlugin(Plugin):
        def initialize(self):
            print("验证插件初始化")
        
        def execute(self, data):
            print(f"验证数据: {data}")
            return data
    
    manager = PluginManager()
    manager.register_plugin(LoggingPlugin())
    manager.register_plugin(ValidationPlugin())
    
    manager.execute_all({"name": "测试数据"})

plugin_system_demo()

中间件模式

中间件模式提供了请求处理的扩展点。

class Middleware:
    def __init__(self):
        self.next_middleware = None
    
    def set_next(self, middleware):
        self.next_middleware = middleware
        return middleware
    
    def handle(self, request):
        if self.next_middleware:
            return self.next_middleware.handle(request)
        return request

class LoggingMiddleware(Middleware):
    def handle(self, request):
        print(f"日志中间件: {request}")
        return super().handle(request)

class AuthMiddleware(Middleware):
    def handle(self, request):
        print(f"认证中间件: {request}")
        return super().handle(request)

def middleware_pattern_demo():
    print("中间件模式演示:")
    
    logging = LoggingMiddleware()
    auth = AuthMiddleware()
    
    logging.set_next(auth)
    result = logging.handle({"user": "admin"})
    print(f"最终结果: {result}")

middleware_pattern_demo()

服务发现

服务发现机制支持动态服务注册和查找。

class ServiceRegistry:
    def __init__(self):
        self._services = {}
    
    def register(self, name, address):
        if name not in self._services:
            self._services[name] = []
        self._services[name].append(address)
    
    def discover(self, name):
        return self._services.get(name, [])

def service_discovery_demo():
    print("服务发现演示:")
    
    registry = ServiceRegistry()
    
    registry.register("user-service", "localhost:8001")
    registry.register("user-service", "localhost:8002")
    registry.register("order-service", "localhost:8003")
    
    user_services = registry.discover("user-service")
    print(f"用户服务: {user_services}")
    
    order_services = registry.discover("order-service")
    print(f"订单服务: {order_services}")

service_discovery_demo()

错误处理

统一的错误处理机制提高了系统的健壮性。

class ErrorHandler:
    def __init__(self):
        self._handlers = {}
    
    def register_handler(self, exception_type, handler):
        self._handlers[exception_type] = handler
    
    def handle(self, exception):
        exception_type = type(exception)
        if exception_type in self._handlers:
            return self._handlers[exception_type](exception)
        return f"未处理的异常: {exception}"

def error_handling_demo():
    print("错误处理演示:")
    
    handler = ErrorHandler()
    
    def handle_value_error(e):
        return f"值错误: {e}"
    
    def handle_key_error(e):
        return f"键错误: {e}"
    
    handler.register_handler(ValueError, handle_value_error)
    handler.register_handler(KeyError, handle_key_error)
    
    print(handler.handle(ValueError("无效的值")))
    print(handler.handle(KeyError("未找到键")))

error_handling_demo()

日志系统

完善的日志系统对于大型项目的调试和监控至关重要。

import logging
from logging.handlers import RotatingFileHandler

class Logger:
    def __init__(self, name, log_file):
        self.logger = logging.getLogger(name)
        self.logger.setLevel(logging.INFO)
        
        handler = RotatingFileHandler(log_file, maxBytes=1024*1024, backupCount=5)
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)
        
        self.logger.addHandler(handler)
    
    def info(self, message):
        self.logger.info(message)
    
    def error(self, message):
        self.logger.error(message)

def logging_system_demo():
    print("日志系统演示:")
    
    logger = Logger("app", "app.log")
    logger.info("应用启动")
    logger.error("发生错误")
    
    print("日志已记录到 app.log")

logging_system_demo()

测试策略

全面的测试策略确保了系统的质量。

import unittest

class Calculator:
    def add(self, a, b):
        return a + b
    
    def subtract(self, a, b):
        return a - b

class TestCalculator(unittest.TestCase):
    def setUp(self):
        self.calculator = Calculator()
    
    def test_add(self):
        self.assertEqual(self.calculator.add(2, 3), 5)
    
    def test_subtract(self):
        self.assertEqual(self.calculator.subtract(5, 3), 2)

def testing_strategy_demo():
    print("测试策略演示:")
    
    suite = unittest.TestLoader().loadTestsFromTestCase(TestCalculator)
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

testing_strategy_demo()

总结

大型 Python 项目的架构设计需要综合考虑模块化、依赖注入、分层架构等多个方面。通过合理的设计模式和实践,我们可以构建出可维护、可扩展、可测试的大型应用系统。

掌握这些架构设计原则和实践,对于开发高质量的 Python 应用至关重要。在实际项目中,需要根据具体的业务需求和技术约束,灵活应用这些设计理念。

异步 Web 框架底层:FastAPI 高性能原理剖析

FastAPI 是现代 Python Web 开发的热门选择,它基于 Starlette 和 Pydantic 构建,提供了高性能和开发效率的完美平衡。本文将深入剖析 FastAPI 的底层原理,从异步处理机制到性能优化策略,帮助读者全面理解 FastAPI 的高性能实现。

FastAPI 架构概览

FastAPI 的架构设计充分利用了 Python 的异步特性,通过 ASGI 协议实现高性能的 Web 服务。

from fastapi import FastAPI
import uvicorn

app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "Hello World"}

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

ASGI 协议基础

ASGI(Asynchronous Server Gateway Interface)是 FastAPI 高性能的基础,它支持异步请求处理。

import asyncio

async def asgi_app(scope, receive, send):
    if scope['type'] == 'http':
        await send({
            'type': 'http.response.start',
            'status': 200,
            'headers': [[b'content-type', b'text/plain']],
        })
        await send({
            'type': 'http.response.body',
            'body': b'Hello from ASGI!',
        })

async def test_asgi():
    scope = {
        'type': 'http',
        'method': 'GET',
        'path': '/',
    }
    
    async def receive():
        return {'type': 'http.request', 'body': b''}
    
    messages = []
    async def send(message):
        messages.append(message)
    
    await asgi_app(scope, receive, send)
    print("ASGI 响应:", messages)

asyncio.run(test_asgi())

异步路由处理

FastAPI 的路由处理完全基于异步机制,能够高效处理大量并发请求。

from fastapi import FastAPI, BackgroundTasks
import asyncio

app = FastAPI()

@app.get("/sync")
def sync_endpoint():
    import time
    time.sleep(1)
    return {"message": "同步响应"}

@app.get("/async")
async def async_endpoint():
    await asyncio.sleep(1)
    return {"message": "异步响应"}

@app.post("/background")
async def background_task(background_tasks: BackgroundTasks):
    def process_data():
        import time
        time.sleep(2)
        print("后台任务完成")
    
    background_tasks.add_task(process_data)
    return {"message": "任务已提交"}

def demonstrate_async_routing():
    print("异步路由处理演示:")
    print("1. 同步端点会阻塞事件循环")
    print("2. 异步端点可以并发处理")
    print("3. 后台任务不阻塞响应")

demonstrate_async_routing()

FastAPI 性能架构

graph TD
    A[HTTP 请求] --> B[ASGI 服务器]
    B --> C[FastAPI 应用]
    C --> D[路由匹配]
    D --> E[依赖注入]
    E --> F[请求验证]
    F --> G[业务逻辑处理]
    G --> H[响应序列化]
    H --> I[HTTP 响应]
    G --> J[后台任务]
    J --> K[任务队列]

依赖注入机制

FastAPI 的依赖注入系统是其核心特性之一,提供了灵活的组件管理和代码复用机制。

from fastapi import FastAPI, Depends, HTTPException
from typing import Optional

app = FastAPI()

async def get_db():
    print("获取数据库连接")
    yield {"connection": "db_connection"}
    print("关闭数据库连接")

async def get_current_user(token: Optional[str] = None):
    if not token:
        raise HTTPException(status_code=401, detail="未授权")
    return {"user_id": 1, "username": "test_user"}

@app.get("/users/me")
async def read_users_me(current_user: dict = Depends(get_current_user)):
    return current_user

@app.get("/items/")
async def read_items(db: dict = Depends(get_db)):
    return {"db": db, "items": []}

def demonstrate_dependency_injection():
    print("依赖注入演示:")
    print("1. 依赖自动解析和注入")
    print("2. 支持异步依赖")
    print("3. 依赖缓存和复用")
    print("4. 嵌套依赖支持")

demonstrate_dependency_injection()

请求验证与序列化

FastAPI 使用 Pydantic 进行请求验证和响应序列化,确保数据的安全性和一致性。

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, Field
from typing import List

app = FastAPI()

class Item(BaseModel):
    name: str = Field(..., min_length=1, max_length=50)
    description: Optional[str] = None
    price: float = Field(..., gt=0)
    tax: Optional[float] = None

class User(BaseModel):
    username: str
    email: str

items_db = []

@app.post("/items/", response_model=Item)
async def create_item(item: Item):
    item_dict = item.dict()
    item_dict["id"] = len(items_db) + 1
    items_db.append(item_dict)
    return item

@app.get("/items/", response_model=List[Item])
async def read_items():
    return items_db

def demonstrate_validation():
    print("请求验证演示:")
    
    valid_item = Item(name="测试商品", price=99.99)
    print(f"有效商品: {valid_item}")
    
    try:
        invalid_item = Item(name="", price=-10)
    except Exception as e:
        print(f"无效商品错误: {e}")

demonstrate_validation()

中间件机制

FastAPI 的中间件机制提供了请求/响应处理的扩展点,可以用于日志、认证、CORS 等功能。

from fastapi import FastAPI, Request
import time

app = FastAPI()

@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

@app.get("/")
async def read_root():
    return {"message": "Hello World"}

def demonstrate_middleware():
    print("中间件演示:")
    print("1. 请求前处理")
    print("2. 调用下一个处理器")
    print("3. 响应后处理")
    print("4. 支持多个中间件")

demonstrate_middleware()

异步数据库操作

FastAPI 可以与异步数据库驱动配合使用,实现高性能的数据库操作。

import asyncio
from typing import List, Dict

class AsyncDatabase:
    def __init__(self):
        self.data: Dict[int, Dict] = {}
        self.next_id = 1
    
    async def create(self, item: Dict) -> Dict:
        await asyncio.sleep(0.01)
        item_id = self.next_id
        item["id"] = item_id
        self.data[item_id] = item
        self.next_id += 1
        return item
    
    async def get(self, item_id: int) -> Dict:
        await asyncio.sleep(0.01)
        return self.data.get(item_id)
    
    async def get_all(self) -> List[Dict]:
        await asyncio.sleep(0.01)
        return list(self.data.values())

async def demonstrate_async_db():
    print("异步数据库演示:")
    
    db = AsyncDatabase()
    
    item1 = await db.create({"name": "商品1", "price": 100})
    print(f"创建商品: {item1}")
    
    item2 = await db.create({"name": "商品2", "price": 200})
    print(f"创建商品: {item2}")
    
    retrieved = await db.get(item1["id"])
    print(f"获取商品: {retrieved}")
    
    all_items = await db.get_all()
    print(f"所有商品: {all_items}")

asyncio.run(demonstrate_async_db())

WebSocket 支持

FastAPI 原生支持 WebSocket,可以实现实时的双向通信。

from fastapi import FastAPI, WebSocket

app = FastAPI()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await websocket.accept()
    try:
        while True:
            data = await websocket.receive_text()
            await websocket.send_text(f"收到消息: {data}")
    except Exception as e:
        print(f"WebSocket 错误: {e}")
    finally:
        await websocket.close()

def demonstrate_websocket():
    print("WebSocket 演示:")
    print("1. 建立连接")
    print("2. 接收消息")
    print("3. 发送响应")
    print("4. 保持连接")

demonstrate_websocket()

性能优化策略

FastAPI 提供了多种性能优化策略,可以进一步提升应用性能。

import asyncio
from functools import lru_cache

class CacheManager:
    def __init__(self):
        self.cache = {}
    
    async def get(self, key: str):
        return self.cache.get(key)
    
    async def set(self, key: str, value, ttl: int = 60):
        self.cache[key] = value
    
    @lru_cache(maxsize=100)
    def cached_computation(self, n: int):
        return sum(i * i for i in range(n))

async def demonstrate_optimization():
    print("性能优化演示:")
    
    cache = CacheManager()
    
    await cache.set("key1", "value1")
    value = await cache.get("key1")
    print(f"缓存值: {value}")
    
    result = cache.cached_computation(1000)
    print(f"计算结果: {result}")
    
    result2 = cache.cached_computation(1000)
    print(f"缓存结果: {result2}")

asyncio.run(demonstrate_optimization())

并发请求处理

FastAPI 可以高效处理大量并发请求,这是其高性能的核心体现。

import asyncio
import time

async def handle_request(request_id: int):
    await asyncio.sleep(0.1)
    return f"响应 {request_id}"

async def demonstrate_concurrency():
    print("并发处理演示:")
    
    start = time.time()
    
    tasks = [handle_request(i) for i in range(100)]
    results = await asyncio.gather(*tasks)
    
    elapsed = time.time() - start
    
    print(f"处理 100 个请求耗时: {elapsed:.2f}秒")
    print(f"平均每个请求: {elapsed/100:.4f}秒")
    print(f"并发性能: {100/elapsed:.1f} 请求/秒")

asyncio.run(demonstrate_concurrency())

错误处理和日志

完善的错误处理和日志记录是构建健壮 Web 应用的关键。

from fastapi import FastAPI, HTTPException, Request
from fastapi.responses import JSONResponse
import logging

app = FastAPI()

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
    logger.error(f"未处理的异常: {exc}")
    return JSONResponse(
        status_code=500,
        content={"detail": "内部服务器错误"}
    )

@app.get("/items/{item_id}")
async def read_item(item_id: int):
    if item_id < 0:
        raise HTTPException(status_code=400, detail="无效的商品 ID")
    
    if item_id > 1000:
        raise ValueError("商品不存在")
    
    return {"item_id": item_id, "name": f"商品 {item_id}"}

def demonstrate_error_handling():
    print("错误处理演示:")
    print("1. 全局异常处理器")
    print("2. HTTP 异常")
    print("3. 自定义异常")
    print("4. 日志记录")

demonstrate_error_handling()

总结

FastAPI 的高性能源于其基于 ASGI 的异步架构、高效的依赖注入系统、强大的请求验证机制以及灵活的中间件支持。通过深入理解这些底层原理,开发者可以更好地利用 FastAPI 构建高性能的 Web 应用。

掌握 FastAPI 的异步处理、数据库操作、WebSocket 支持、性能优化等核心技术,对于构建现代、高效的 Python Web 应用至关重要。FastAPI 不仅是开发工具,更是现代 Python Web 开发的最佳实践体现。

Python 设计模式实战:23 种模式场景化落地

设计模式是软件工程中的最佳实践,Python 作为一门灵活的语言,为各种设计模式的实现提供了优雅的语法支持。本文将通过实际场景深入讲解 23 种设计模式在 Python 中的落地应用,帮助读者掌握设计模式的实际运用。

创建型模式

创建型模式关注对象的创建过程,提供了灵活的对象创建机制。

单例模式

单例模式确保一个类只有一个实例,并提供全局访问点。

class Singleton:
    _instance = None
    
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance.initialized = False
        return cls._instance
    
    def __init__(self):
        if not self.initialized:
            self.value = 0
            self.initialized = True

def singleton_demo():
    print("单例模式演示:")
    
    s1 = Singleton()
    s2 = Singleton()
    
    print(f"s1 is s2: {s1 is s2}")
    print(f"s1.value: {s1.value}")
    
    s1.value = 100
    print(f"s2.value: {s2.value}")

singleton_demo()

工厂方法模式

工厂方法模式定义创建对象的接口,让子类决定实例化哪个类。

from abc import ABC, abstractmethod

class Animal(ABC):
    @abstractmethod
    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        return "汪汪"

class Cat(Animal):
    def make_sound(self):
        return "喵喵"

class AnimalFactory:
    @staticmethod
    def create_animal(animal_type):
        if animal_type == "dog":
            return Dog()
        elif animal_type == "cat":
            return Cat()
        else:
            raise ValueError("未知的动物类型")

def factory_method_demo():
    print("工厂方法模式演示:")
    
    dog = AnimalFactory.create_animal("dog")
    cat = AnimalFactory.create_animal("cat")
    
    print(f"狗叫声: {dog.make_sound()}")
    print(f"猫叫声: {cat.make_sound()}")

factory_method_demo()

抽象工厂模式

抽象工厂模式提供创建相关或依赖对象的接口,无需指定具体类。

from abc import ABC, abstractmethod

class Button(ABC):
    @abstractmethod
    def render(self):
        pass

class Checkbox(ABC):
    @abstractmethod
    def render(self):
        pass

class WindowsButton(Button):
    def render(self):
        return "Windows 按钮"

class WindowsCheckbox(Checkbox):
    def render(self):
        return "Windows 复选框"

class MacButton(Button):
    def render(self):
        return "Mac 按钮"

class MacCheckbox(Checkbox):
    def render(self):
        return "Mac 复选框"

class GUIFactory(ABC):
    @abstractmethod
    def create_button(self):
        pass
    
    @abstractmethod
    def create_checkbox(self):
        pass

class WindowsFactory(GUIFactory):
    def create_button(self):
        return WindowsButton()
    
    def create_checkbox(self):
        return WindowsCheckbox()

class MacFactory(GUIFactory):
    def create_button(self):
        return MacButton()
    
    def create_checkbox(self):
        return MacCheckbox()

def abstract_factory_demo():
    print("抽象工厂模式演示:")
    
    windows_factory = WindowsFactory()
    mac_factory = MacFactory()
    
    print(f"Windows: {windows_factory.create_button().render()}, {windows_factory.create_checkbox().render()}")
    print(f"Mac: {mac_factory.create_button().render()}, {mac_factory.create_checkbox().render()}")

abstract_factory_demo()

建造者模式

建造者模式将复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。

class Computer:
    def __init__(self):
        self.cpu = None
        self.memory = None
        self.storage = None
    
    def __str__(self):
        return f"CPU: {self.cpu}, 内存: {self.memory}, 存储: {self.storage}"

class ComputerBuilder:
    def __init__(self):
        self.computer = Computer()
    
    def set_cpu(self, cpu):
        self.computer.cpu = cpu
        return self
    
    def set_memory(self, memory):
        self.computer.memory = memory
        return self
    
    def set_storage(self, storage):
        self.computer.storage = storage
        return self
    
    def build(self):
        return self.computer

def builder_demo():
    print("建造者模式演示:")
    
    computer = (ComputerBuilder()
                .set_cpu("Intel i7")
                .set_memory("16GB")
                .set_storage("512GB SSD")
                .build())
    
    print(f"配置的电脑: {computer}")

builder_demo()

原型模式

原型模式通过复制现有对象来创建新对象,提高创建效率。

import copy

class Prototype:
    def __init__(self, value):
        self.value = value
    
    def clone(self):
        return copy.deepcopy(self)

def prototype_demo():
    print("原型模式演示:")
    
    original = Prototype("原始对象")
    cloned = original.clone()
    
    print(f"原始对象: {original.value}")
    print(f"克隆对象: {cloned.value}")
    print(f"是否相同: {original is cloned}")

prototype_demo()

结构型模式

结构型模式关注类和对象的组合,形成更大的结构。

适配器模式

适配器模式将一个类的接口转换成客户希望的另一个接口。

class Target:
    def request(self):
        return "目标接口"

class Adaptee:
    def specific_request(self):
        return "特定接口"

class Adapter(Target):
    def __init__(self, adaptee):
        self.adaptee = adaptee
    
    def request(self):
        return self.adaptee.specific_request()

def adapter_demo():
    print("适配器模式演示:")
    
    adaptee = Adaptee()
    adapter = Adapter(adaptee)
    
    print(f"适配器请求: {adapter.request()}")

adapter_demo()

桥接模式

桥接模式将抽象与实现分离,使它们可以独立变化。

class DrawingAPI:
    def draw_circle(self, x, y, radius):
        pass

class DrawingAPI1(DrawingAPI):
    def draw_circle(self, x, y, radius):
        return f"API1 绘制圆形: ({x}, {y}), 半径: {radius}"

class DrawingAPI2(DrawingAPI):
    def draw_circle(self, x, y, radius):
        return f"API2 绘制圆形: ({x}, {y}), 半径: {radius}"

class Shape:
    def __init__(self, drawing_api):
        self.drawing_api = drawing_api
    
    def draw(self):
        pass

class Circle(Shape):
    def __init__(self, x, y, radius, drawing_api):
        super().__init__(drawing_api)
        self.x = x
        self.y = y
        self.radius = radius
    
    def draw(self):
        return self.drawing_api.draw_circle(self.x, self.y, self.radius)

def bridge_demo():
    print("桥接模式演示:")
    
    circle1 = Circle(1, 2, 3, DrawingAPI1())
    circle2 = Circle(4, 5, 6, DrawingAPI2())
    
    print(circle1.draw())
    print(circle2.draw())

bridge_demo()

组合模式

组合模式将对象组合成树形结构以表示"部分-整体"的层次结构。

class Component:
    def operation(self):
        pass
    
    def add(self, component):
        pass
    
    def remove(self, component):
        pass

class Leaf(Component):
    def operation(self):
        return "叶子节点"

class Composite(Component):
    def __init__(self):
        self.children = []
    
    def add(self, component):
        self.children.append(component)
    
    def remove(self, component):
        self.children.remove(component)
    
    def operation(self):
        results = [child.operation() for child in self.children]
        return f"组合节点: {', '.join(results)}"

def composite_demo():
    print("组合模式演示:")
    
    leaf1 = Leaf()
    leaf2 = Leaf()
    composite = Composite()
    
    composite.add(leaf1)
    composite.add(leaf2)
    
    print(composite.operation())

composite_demo()

装饰器模式

装饰器模式动态地给对象添加额外的职责。

class Component:
    def operation(self):
        return "基本操作"

class Decorator(Component):
    def __init__(self, component):
        self.component = component
    
    def operation(self):
        return self.component.operation()

class ConcreteDecorator(Decorator):
    def operation(self):
        return f"装饰 {super().operation()}"

def decorator_demo():
    print("装饰器模式演示:")
    
    component = Component()
    decorated = ConcreteDecorator(component)
    
    print(decorated.operation())

decorator_demo()

外观模式

外观模式为子系统中的一组接口提供一个一致的界面。

class SubsystemA:
    def operation_a(self):
        return "子系统 A 操作"

class SubsystemB:
    def operation_b(self):
        return "子系统 B 操作"

class Facade:
    def __init__(self):
        self.subsystem_a = SubsystemA()
        self.subsystem_b = SubsystemB()
    
    def operation(self):
        return f"{self.subsystem_a.operation_a()}, {self.subsystem_b.operation_b()}"

def facade_demo():
    print("外观模式演示:")
    
    facade = Facade()
    print(facade.operation())

facade_demo()

享元模式

享元模式运用共享技术有效地支持大量细粒度的对象。

class Flyweight:
    def __init__(self, intrinsic_state):
        self.intrinsic_state = intrinsic_state
    
    def operation(self, extrinsic_state):
        return f"内蕴状态: {self.intrinsic_state}, 外蕴状态: {extrinsic_state}"

class FlyweightFactory:
    def __init__(self):
        self.flyweights = {}
    
    def get_flyweight(self, key):
        if key not in self.flyweights:
            self.flyweights[key] = Flyweight(key)
        return self.flyweights[key]

def flyweight_demo():
    print("享元模式演示:")
    
    factory = FlyweightFactory()
    
    flyweight1 = factory.get_flyweight("共享对象")
    flyweight2 = factory.get_flyweight("共享对象")
    
    print(f"是否相同: {flyweight1 is flyweight2}")
    print(flyweight1.operation("外蕴状态 1"))
    print(flyweight2.operation("外蕴状态 2"))

flyweight_demo()

代理模式

代理模式为其他对象提供一种代理以控制对这个对象的访问。

class Subject:
    def request(self):
        pass

class RealSubject(Subject):
    def request(self):
        return "真实请求"

class Proxy(Subject):
    def __init__(self):
        self.real_subject = None
    
    def request(self):
        if self.real_subject is None:
            self.real_subject = RealSubject()
        return self.real_subject.request()

def proxy_demo():
    print("代理模式演示:")
    
    proxy = Proxy()
    print(proxy.request())

proxy_demo()

行为型模式

行为型模式关注对象之间的通信和职责分配。

责任链模式

责任链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

class Handler:
    def __init__(self):
        self.next_handler = None
    
    def set_next(self, handler):
        self.next_handler = handler
        return handler
    
    def handle(self, request):
        if self.next_handler:
            return self.next_handler.handle(request)
        return None

class ConcreteHandler1(Handler):
    def handle(self, request):
        if request == "请求1":
            return "处理请求1"
        return super().handle(request)

class ConcreteHandler2(Handler):
    def handle(self, request):
        if request == "请求2":
            return "处理请求2"
        return super().handle(request)

def chain_of_responsibility_demo():
    print("责任链模式演示:")
    
    handler1 = ConcreteHandler1()
    handler2 = ConcreteHandler2()
    handler1.set_next(handler2)
    
    print(handler1.handle("请求1"))
    print(handler1.handle("请求2"))

chain_of_responsibility_demo()

命令模式

命令模式将请求封装为对象,从而可用不同的请求对客户进行参数化。

class Command:
    def execute(self):
        pass

class Receiver:
    def action(self):
        return "执行操作"

class ConcreteCommand(Command):
    def __init__(self, receiver):
        self.receiver = receiver
    
    def execute(self):
        return self.receiver.action()

class Invoker:
    def __init__(self):
        self.command = None
    
    def set_command(self, command):
        self.command = command
    
    def execute_command(self):
        return self.command.execute()

def command_demo():
    print("命令模式演示:")
    
    receiver = Receiver()
    command = ConcreteCommand(receiver)
    invoker = Invoker()
    
    invoker.set_command(command)
    print(invoker.execute_command())

command_demo()

迭代器模式

迭代器模式提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。

class Iterator:
    def has_next(self):
        pass
    
    def next(self):
        pass

class ConcreteIterator(Iterator):
    def __init__(self, collection):
        self.collection = collection
        self.index = 0
    
    def has_next(self):
        return self.index < len(self.collection)
    
    def next(self):
        if self.has_next():
            item = self.collection[self.index]
            self.index += 1
            return item
        return None

def iterator_demo():
    print("迭代器模式演示:")
    
    collection = [1, 2, 3, 4, 5]
    iterator = ConcreteIterator(collection)
    
    while iterator.has_next():
        print(iterator.next())

iterator_demo()

中介者模式

中介者模式用一个中介对象来封装一系列的对象交互。

class Mediator:
    def send(self, message, colleague):
        pass

class Colleague:
    def __init__(self, mediator):
        self.mediator = mediator
    
    def send(self, message):
        self.mediator.send(message, self)
    
    def receive(self, message):
        pass

class ConcreteColleague1(Colleague):
    def receive(self, message):
        return f"同事1收到: {message}"

class ConcreteColleague2(Colleague):
    def receive(self, message):
        return f"同事2收到: {message}"

class ConcreteMediator(Mediator):
    def __init__(self):
        self.colleague1 = None
        self.colleague2 = None
    
    def send(self, message, colleague):
        if colleague == self.colleague1:
            return self.colleague2.receive(message)
        else:
            return self.colleague1.receive(message)

def mediator_demo():
    print("中介者模式演示:")
    
    mediator = ConcreteMediator()
    colleague1 = ConcreteColleague1(mediator)
    colleague2 = ConcreteColleague2(mediator)
    
    mediator.colleague1 = colleague1
    mediator.colleague2 = colleague2
    
    print(colleague1.send("你好"))
    print(colleague2.send("再见"))

mediator_demo()

备忘录模式

备忘录模式在不破坏封装性的前提下,捕获一个对象的内部状态。

class Memento:
    def __init__(self, state):
        self.state = state

class Originator:
    def __init__(self):
        self.state = None
    
    def set_state(self, state):
        self.state = state
    
    def save_state(self):
        return Memento(self.state)
    
    def restore_state(self, memento):
        self.state = memento.state

class Caretaker:
    def __init__(self):
        self.mementos = []
    
    def add_memento(self, memento):
        self.mementos.append(memento)
    
    def get_memento(self, index):
        return self.mementos[index]

def memento_demo():
    print("备忘录模式演示:")
    
    originator = Originator()
    caretaker = Caretaker()
    
    originator.set_state("状态1")
    caretaker.add_memento(originator.save_state())
    
    originator.set_state("状态2")
    caretaker.add_memento(originator.save_state())
    
    originator.restore_state(caretaker.get_memento(0))
    print(f"恢复状态: {originator.state}")

memento_demo()

观察者模式

观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知。

class Observer:
    def update(self, message):
        pass

class Subject:
    def __init__(self):
        self.observers = []
    
    def attach(self, observer):
        self.observers.append(observer)
    
    def detach(self, observer):
        self.observers.remove(observer)
    
    def notify(self, message):
        for observer in self.observers:
            observer.update(message)

class ConcreteObserver(Observer):
    def __init__(self, name):
        self.name = name
    
    def update(self, message):
        return f"{self.name} 收到: {message}"

def observer_demo():
    print("观察者模式演示:")
    
    subject = Subject()
    observer1 = ConcreteObserver("观察者1")
    observer2 = ConcreteObserver("观察者2")
    
    subject.attach(observer1)
    subject.attach(observer2)
    
    print(subject.notify("新消息"))

observer_demo()

状态模式

状态模式允许一个对象在其内部状态改变时改变它的行为。

class State:
    def handle(self):
        pass

class ConcreteStateA(State):
    def handle(self):
        return "状态 A"

class ConcreteStateB(State):
    def handle(self):
        return "状态 B"

class Context:
    def __init__(self):
        self.state = None
    
    def set_state(self, state):
        self.state = state
    
    def request(self):
        return self.state.handle()

def state_demo():
    print("状态模式演示:")
    
    context = Context()
    state_a = ConcreteStateA()
    state_b = ConcreteStateB()
    
    context.set_state(state_a)
    print(context.request())
    
    context.set_state(state_b)
    print(context.request())

state_demo()

策略模式

策略模式定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。

class Strategy:
    def execute(self):
        pass

class ConcreteStrategyA(Strategy):
    def execute(self):
        return "策略 A"

class ConcreteStrategyB(Strategy):
    def execute(self):
        return "策略 B"

class Context:
    def __init__(self, strategy):
        self.strategy = strategy
    
    def set_strategy(self, strategy):
        self.strategy = strategy
    
    def execute_strategy(self):
        return self.strategy.execute()

def strategy_demo():
    print("策略模式演示:")
    
    context = Context(ConcreteStrategyA())
    print(context.execute_strategy())
    
    context.set_strategy(ConcreteStrategyB())
    print(context.execute_strategy())

strategy_demo()

模板方法模式

模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。

from abc import ABC, abstractmethod

class AbstractClass(ABC):
    def template_method(self):
        self.primitive_operation1()
        self.primitive_operation2()
    
    @abstractmethod
    def primitive_operation1(self):
        pass
    
    @abstractmethod
    def primitive_operation2(self):
        pass

class ConcreteClass(AbstractClass):
    def primitive_operation1(self):
        return "操作1"
    
    def primitive_operation2(self):
        return "操作2"

def template_method_demo():
    print("模板方法模式演示:")
    
    concrete = ConcreteClass()
    concrete.template_method()

template_method_demo()

访问者模式

访问者模式表示一个作用于某对象结构中的各元素的操作。

class Visitor:
    def visit_element_a(self, element):
        pass
    
    def visit_element_b(self, element):
        pass

class ConcreteVisitor(Visitor):
    def visit_element_a(self, element):
        return f"访问元素 A: {element.operation_a()}"
    
    def visit_element_b(self, element):
        return f"访问元素 B: {element.operation_b()}"

class Element:
    def accept(self, visitor):
        pass

class ElementA(Element):
    def operation_a(self):
        return "元素 A 操作"
    
    def accept(self, visitor):
        return visitor.visit_element_a(self)

class ElementB(Element):
    def operation_b(self):
        return "元素 B 操作"
    
    def accept(self, visitor):
        return visitor.visit_element_b(self)

def visitor_demo():
    print("访问者模式演示:")
    
    visitor = ConcreteVisitor()
    element_a = ElementA()
    element_b = ElementB()
    
    print(element_a.accept(visitor))
    print(element_b.accept(visitor))

visitor_demo()

总结

23 种设计模式在 Python 中的实现体现了面向对象设计的精髓。通过实际场景的落地应用,我们可以更好地理解每种模式的适用场景和实现方式。

掌握设计模式不仅能够提高代码的可维护性和可扩展性,还能帮助开发者更好地理解和应用面向对象设计原则。在实际项目中,合理使用设计模式可以大大提高代码质量和开发效率。

Python C 扩展:用 C 语言加速核心计算

Python C 扩展允许开发者用 C 语言编写高性能的 Python 模块,是加速核心计算的有效手段。本文将深入探讨 Python C 扩展的开发方法,从基础的 API 使用到高级的优化技巧,帮助读者掌握用 C 语言加速 Python 程序的核心技术。

Python C API 基础

Python C API 提供了丰富的接口,用于在 C 代码中操作 Python 对象和调用 Python 函数。

#include <Python.h>

static PyObject* hello_world(PyObject* self, PyObject* args) {
    return Py_BuildValue("s", "Hello from C!");
}

static PyMethodDef module_methods[] = {
    {"hello_world", hello_world, METH_NOARGS, "Say hello from C"},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef moduledef = {
    PyModuleDef_HEAD_INIT,
    "hello_module",
    "A simple hello module",
    -1,
    module_methods
};

PyMODINIT_FUNC PyInit_hello_module(void) {
    return PyModule_Create(&moduledef);
}

Python 调用 C 扩展

编写好 C 扩展后,需要在 Python 中编译和调用它。

import sys
import ctypes

def call_c_extension():
    print("Python 调用 C 扩演示:")
    
    try:
        import hello_module
        result = hello_module.hello_world()
        print(f"结果: {result}")
    except ImportError:
        print("C 扩展模块未找到")
        print("需要先编译 C 扩展")

call_c_extension()

数值计算优化

使用 C 语言进行数值计算可以显著提高性能。

#include <Python.h>

static PyObject* sum_squares(PyObject* self, PyObject* args) {
    PyObject* list_obj;
    if (!PyArg_ParseTuple(args, "O", &list_obj)) {
        return NULL;
    }
    
    if (!PyList_Check(list_obj)) {
        PyErr_SetString(PyExc_TypeError, "Expected a list");
        return NULL;
    }
    
    Py_ssize_t length = PyList_Size(list_obj);
    long long sum = 0;
    
    for (Py_ssize_t i = 0; i < length; i++) {
        PyObject* item = PyList_GetItem(list_obj, i);
        if (PyLong_Check(item)) {
            long value = PyLong_AsLong(item);
            sum += value * value;
        }
    }
    
    return PyLong_FromLongLong(sum);
}

static PyMethodDef math_methods[] = {
    {"sum_squares", sum_squares, METH_VARARGS, "Calculate sum of squares"},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef math_moduledef = {
    PyModuleDef_HEAD_INIT,
    "math_extension",
    "High-performance math operations",
    -1,
    math_methods
};

PyMODINIT_FUNC PyInit_math_extension(void) {
    return PyModule_Create(&math_moduledef);
}

性能对比

对比 Python 原生实现和 C 扩展的性能差异。

import time

def python_sum_squares(numbers):
    return sum(x * x for x in numbers)

def performance_comparison():
    print("性能对比测试:")
    
    numbers = list(range(100000))
    
    start = time.time()
    result1 = python_sum_squares(numbers)
    time1 = time.time() - start
    print(f"Python 实现: {time1:.4f}秒, 结果: {result1}")
    
    try:
        import math_extension
        start = time.time()
        result2 = math_extension.sum_squares(numbers)
        time2 = time.time() - start
        print(f"C 扩展实现: {time2:.4f}秒, 结果: {result2}")
        print(f"性能提升: {time1/time2:.1f}x")
    except ImportError:
        print("C 扩展模块未找到")

performance_comparison()

C 扩展开发流程

graph TD
    A[需求分析] --> B[设计 C API]
    B --> C[编写 C 代码]
    C --> D[编写 setup.py]
    D --> E[编译扩展]
    E --> F[测试功能]
    F --> G[性能测试]
    G --> H{性能达标?}
    H -->|否| I[优化 C 代码]
    I --> C
    H -->|是| J[发布使用]

内存管理

在 C 扩展中正确管理内存是避免内存泄漏的关键。

#include <Python.h>

static PyObject* create_large_array(PyObject* self, PyObject* args) {
    int size;
    if (!PyArg_ParseTuple(args, "i", &size)) {
        return NULL;
    }
    
    PyObject* result = PyList_New(size);
    if (result == NULL) {
        return NULL;
    }
    
    for (int i = 0; i < size; i++) {
        PyObject* item = PyLong_FromLong(i * i);
        if (item == NULL) {
            Py_DECREF(result);
            return NULL;
        }
        
        PyList_SET_ITEM(result, i, item);
    }
    
    return result;
}

static PyMethodDef memory_methods[] = {
    {"create_large_array", create_large_array, METH_VARARGS, "Create large array"},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef memory_moduledef = {
    PyModuleDef_HEAD_INIT,
    "memory_extension",
    "Memory management examples",
    -1,
    memory_methods
};

PyMODINIT_FUNC PyInit_memory_extension(void) {
    return PyModule_Create(&memory_moduledef);
}

错误处理

在 C 扩展中正确处理错误对于构建健壮的模块至关重要。

#include <Python.h>

static PyObject* safe_divide(PyObject* self, PyObject* args) {
    double a, b;
    if (!PyArg_ParseTuple(args, "dd", &a, &b)) {
        return NULL;
    }
    
    if (b == 0.0) {
        PyErr_SetString(PyExc_ZeroDivisionError, "Division by zero");
        return NULL;
    }
    
    return PyFloat_FromDouble(a / b);
}

static PyObject* validate_input(PyObject* self, PyObject* args) {
    PyObject* obj;
    if (!PyArg_ParseTuple(args, "O", &obj)) {
        return NULL;
    }
    
    if (!PyLong_Check(obj)) {
        PyErr_SetString(PyExc_TypeError, "Expected an integer");
        return NULL;
    }
    
    long value = PyLong_AsLong(obj);
    if (value < 0) {
        PyErr_SetString(PyExc_ValueError, "Value must be non-negative");
        return NULL;
    }
    
    return PyLong_FromLong(value * value);
}

static PyMethodDef error_methods[] = {
    {"safe_divide", safe_divide, METH_VARARGS, "Safe division"},
    {"validate_input", validate_input, METH_VARARGS, "Validate input"},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef error_moduledef = {
    PyModuleDef_HEAD_INIT,
    "error_extension",
    "Error handling examples",
    -1,
    error_methods
};

PyMODINIT_FUNC PyInit_error_extension(void) {
    return PyModule_Create(&error_moduledef);
}

NumPy 集成

C 扩展可以与 NumPy 集成,实现高性能的数组操作。

import numpy as np
import time

def numpy_integration_demo():
    print("NumPy 集成演示:")
    
    array = np.random.rand(1000000)
    
    start = time.time()
    result = np.sum(array ** 2)
    time1 = time.time() - start
    print(f"NumPy 实现: {time1:.4f}秒")
    
    start = time.time()
    result = sum(x ** 2 for x in array)
    time2 = time.time() - start
    print(f"Python 实现: {time2:.4f}秒")
    
    print(f"性能提升: {time2/time1:.1f}x")

numpy_integration_demo()

多线程支持

在 C 扩展中支持多线程需要正确使用 GIL。

#include <Python.h>
#include <pthread.h>

struct thread_data {
    long start;
    long end;
    long long* result;
};

void* thread_function(void* arg) {
    struct thread_data* data = (struct thread_data*)arg;
    long long sum = 0;
    
    for (long i = data->start; i < data->end; i++) {
        sum += i * i;
    }
    
    data->result[0] = sum;
    return NULL;
}

static PyObject* parallel_sum_squares(PyObject* self, PyObject* args) {
    long n;
    if (!PyArg_ParseTuple(args, "l", &n)) {
        return NULL;
    }
    
    int num_threads = 4;
    pthread_t threads[num_threads];
    struct thread_data thread_data[num_threads];
    long long results[num_threads];
    
    long chunk_size = n / num_threads;
    
    for (int i = 0; i < num_threads; i++) {
        thread_data[i].start = i * chunk_size;
        thread_data[i].end = (i == num_threads - 1) ? n : (i + 1) * chunk_size;
        thread_data[i].result = &results[i];
        pthread_create(&threads[i], NULL, thread_function, &thread_data[i]);
    }
    
    for (int i = 0; i < num_threads; i++) {
        pthread_join(threads[i], NULL);
    }
    
    long long total_sum = 0;
    for (int i = 0; i < num_threads; i++) {
        total_sum += results[i];
    }
    
    return PyLong_FromLongLong(total_sum);
}

static PyMethodDef thread_methods[] = {
    {"parallel_sum_squares", parallel_sum_squares, METH_VARARGS, "Parallel sum of squares"},
    {NULL, NULL, 0, NULL}
};

static struct PyModuleDef thread_moduledef = {
    PyModuleDef_HEAD_INIT,
    "thread_extension",
    "Threaded operations",
    -1,
    thread_methods
};

PyMODINIT_FUNC PyInit_thread_extension(void) {
    return PyModule_Create(&thread_moduledef);
}

性能优化技巧

掌握 C 扩展的性能优化技巧可以进一步提升性能。

import time
from functools import lru_cache

def python_fibonacci(n):
    if n <= 1:
        return n
    return python_fibonacci(n - 1) + python_fibonacci(n - 2)

@lru_cache(maxsize=None)
def cached_fibonacci(n):
    if n <= 1:
        return n
    return cached_fibonacci(n - 1) + cached_fibonacci(n - 2)

def optimization_demo():
    print("优化技巧演示:")
    
    n = 35
    
    start = time.time()
    result1 = python_fibonacci(n)
    time1 = time.time() - start
    print(f"递归实现: {time1:.4f}秒")
    
    start = time.time()
    result2 = cached_fibonacci(n)
    time2 = time.time() - start
    print(f"缓存实现: {time2:.4f}秒")
    
    print(f"性能提升: {time1/time2:.1f}x")

optimization_demo()

调试和测试

正确调试和测试 C 扩展是确保其稳定性的重要环节。

import sys
import time

def test_c_extension():
    print("C 扩展测试:")
    
    try:
        import math_extension
        
        test_cases = [
            ([1, 2, 3], 14),
            ([], 0),
            ([0, 1, -1], 2)
        ]
        
        for input_data, expected in test_cases:
            result = math_extension.sum_squares(input_data)
            assert result == expected, f"测试失败: {input_data} -> {result} (期望 {expected})"
            print(f"测试通过: {input_data} -> {result}")
        
        print("所有测试通过")
        
    except ImportError:
        print("C 扩展模块未找到")
    except AssertionError as e:
        print(f"测试失败: {e}")

test_c_extension()

总结

Python C 扩展是加速核心计算的有效手段,通过用 C 语言重写关键代码段,可以获得显著的性能提升。掌握 Python C API、内存管理、错误处理等核心技术,以及多线程支持、性能优化等高级技巧,可以构建出高性能的 Python 扩展模块。

在实际开发中,需要平衡开发成本和性能收益,选择合适的优化策略。C 扩展虽然开发复杂度较高,但对于性能要求极高的场景,仍然是不可替代的解决方案。

现在涉及价值判断和社会科学的问题我都不问 GPT 了,因为它会一直端水、和稀泥、扮好人,想教育我的价值观。指责他错他还会先狡辩,然后继续装圣母输出道德正确的废话。Grok 感觉过于刻意俏皮,一定要嘻嘻哈哈,有效信息密度很低。Gemini 稍微平衡点

以我们公司当前研发团队为例,在同级别、年限差不多的情况下,确实存在测试 QA 薪资高于开发的情况。

A 同事,后端开发工程师

入职 4 年
职级:P6
月薪:25K

B 同事,测试 QA 工程师
入职 4 年
职级:P6
月薪:28K

从表面看,两人年限相当、职级一致,但 QA 的薪资明显高于开发。 你觉得合理吗

在大量文件下载时

Motrix 在导入时崩溃

Aria2c 可能会丢失下载失败的文件

有没有什么较好的 Aria2 软件

测试多文件下载

需要点击右边底下 3 个小点更多,点击开关复选框,选择下载的文件,点击发送到 Aria2
测试 1
测试 2

顺便分享一个自编译的 Aria2c 可以 256 连接数下载 文件下载

问题描述

op 使用的是去年发布的 iPhone 17 pro, SIM 卡是中国联通

从上一代 iPhone 13 迭代上来, SIM 没有更换, 发现 17 的定位似乎比 13 还不靠谱

问题表现

  1. 使用 keep 在城市的公园(附近有高楼)绕圈跑步, 运动轨迹出现很乱的概率变多了
  2. 更换了一天朋友的电信卡, 在同样的公园绕圈跑步, 轨迹混乱的程度很少. 但测试样本只有这一次, 无法确认是否为 SIM 的增益
  3. 使用百度地图导航时, 人还在原地就提示已经偏航, 且次数不少. 这我理解为定位漂移, 导致了地图提示偏航

思考

一直以为是中国联通的问题, 毕竟三大运营商里面它的信号最差了

当然我也知道 iPhone 本身也有问题, 但显然更换 SIM 卡的成本更低

想起来有一些手表是有 GPS 功能的, 而且它们也不需要插入 SIM 卡, 那么就说明 GPS 不需要 SIM 卡的帮助也能进行

问了一下 ai. 果然, SIM 卡的定位精度更差, 我的跑步路线虽然很乱, 但确确实实没有出现 10m 这么大的误差, SIM 卡主要是在 GPS 中充当了辅助的定位

新的问题

那么新的问题来了, 既然更换 SIM 卡的增益不大, 难道只能更换手机了吗? 还是说我哪里的操作有问题?

以下因素已排除

  1. 省电模式没有开启
  2. 后台刷新开启
  3. GPS 权限肯定也给了
  4. 手机壳是凯夫拉材质的
  5. 平时跑步手机放在腰包里

顾虑

ai 推荐我买一个带 GPS 功能的手表, 但我已经有一个小米手环(无 GPS). 专门买一个运动手表, 成本有点高, 而且我不太喜欢手上戴东西(可以的话, 其实手机我也不想带)

如果你最近在关注 AI Agent,一定会发现一个趋势:

AI 不再只是聊天工具,而是开始变成真正的"执行者"。

它能写代码、做设计、分析数据、自动完成任务。

但问题来了:

如何让 AI Agent 拥有更多能力?

答案是:

给它安装 Skills(技能)。

今天介绍的这个网站,就是专门做这件事的:

👉 https://skills.sh

它正在成为 AI Agent 世界的"技能商店"。


一、什么是 Skills?

用一句话解释:

Skills = AI Agent 的可安装能力模块

就像:

  • 手机可以安装 App
  • VSCode 可以安装插件
  • 浏览器可以安装扩展

现在,AI Agent 也可以安装 Skills。

安装之后,AI 就不只是"会聊天",而是:

  • 会写更专业的代码
  • 会做更规范的设计
  • 会执行复杂流程
  • 会完成专业任务

二、为什么 Skills 很重要?

未来 AI 的能力取决于:

模型能力 × Skills 数量 × Skills 质量

没有 Skills 的 AI:

"帮我设计一个网站"

AI:给你一段基础代码。

安装了专业 Skills 的 AI:

直接生成符合设计规范、结构清晰、可上线的完整项目。

这就是区别。

Skills,正在成为 AI Agent 的"外挂系统"。


三、Skills.sh 是什么?

Skills.sh 是一个开源的 AI Agent Skills 目录生态。

你可以把它理解为:

  • AI Agent 的插件市场
  • AI Agent 的技能仓库
  • AI Agent 的能力扩展平台

它最大的特点是可以一键安装 Skills:

npx skills add owner/repo

简单直接。


四、支持哪些 AI Agent?

目前支持多种主流 AI Agent 工具,包括:

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Gemini
  • VSCode Agent
  • Windsurf
  • Codex
  • Trae 等

这是一个开放生态,而不是单一平台。


五、目前已有多少 Skills?

目前已有超过 61,000+ Skills,涵盖:

编程开发

  • React 最佳实践
  • Next.js 技能
  • Python 优化
  • API 设计模式
  • 架构设计

AI Agent 能力增强

  • 自动浏览网页
  • 并行 Agent 调度
  • 记忆管理
  • Prompt 优化

内容创作

  • 文案写作
  • SEO 优化
  • 内容策略
  • 社交媒体内容生成

办公能力

  • PDF 处理
  • Excel 处理
  • PPT 生成
  • 文档协作

Skills 正在让 AI 从"聊天工具"变成"生产力工具"。


六、Skills 的本质是什么?

本质上,Skills 是:

把专家经验模块化

一个资深工程师的经验,可以封装成 Skill。

任何 AI 安装后,都能拥有类似的能力。

这是非常颠覆性的事情。


七、总结

Skills.sh 正在构建 AI Agent 的技能生态系统。

它的意义是:

  • 让 AI 可以扩展能力
  • 让 AI 可以安装技能
  • 让 AI 从聊天工具变成执行工具

一句话总结:

Skills,是 AI Agent 的外挂系统。

结语

未来最强的 AI,

不是模型最大,

而是 Skills 最多。

当 AI 可以不断安装技能,

它将不再只是工具,

而是你的数字分身。

本文由mdnice多平台发布