metap: 一个用于 Python 的元编程层

2025 年 7 月 19 日:

  • 发布新包metap,这是一个易于使用且功能强大的 Python 元编程层, overdue 已久且是作者最常用的工具。
  • 主要内容包括:

    • 为什么元编程有用:元编程层可提供接口让元程序操作对象程序,有程序增强、代码生成、结构自省三种有用用例。

      • 程序增强:以动态检查类型注解为例,如通过 MPL 增强程序以检查动态值与注解是否一致。
      • 代码生成:常见模式是有含多个返回的函数,如编译器模式匹配器,MPL 可生成代码,如_retn_ifn(X),提高编程效率和代码可读性,且代码生成能力可扩展。
      • 结构自省:当程序自省自身结构时元编程更强大,如断言循环不包含continue,而 Python 内置元编程能力未提供这些功能,[metap]可提供。
    • [metap]教程介绍:[metap]通过客户端和元程序工作,客户端处理元程序生成有效 Python 程序。

      • 程序增强:以简单日志记录为例,[metap]可让用户记录各种内容,如返回、中断等,还可提供动态检查等功能。
      • 代码生成:通过[metap]的超集 Python 实现,如用于 Markdown-to-HTML 编译器的示例,可使用_cvar()等特性避免代码重复,还可定义自己的宏。
      • 结构自省:在[metap]中主要用于检查某些有助于维护性和正确性的属性,如循环中禁止continue,若添加则会报错,未来计划添加类似 Go 的延迟语句。
    • 元编程到底是什么:元程序指定对象程序,元编程层将元程序转换为对象程序,与编译器和抽象语义相关。

      • 编译器与抽象语义:传统 C 编译器不是元编程层,因为 C 程序是抽象的,难以预测编译器生成的汇编代码。
      • 元编程层与领域特定语言(DSL):DSL 有优势如可进行操作融合等优化,有一定便携性,但用户可能不了解实现细节易出错;MPL 可生成可预测、透明、可调试的代码,有多种优势,[metap]是 MPL 而非 DSL。
    • 流行编程文化中的元编程:近年来越来越多人欣赏元编程的好处,但 C++和 Go 的元编程实现存在问题,如 C++模板编译时间长、错误信息差,Go 泛型也有问题,现代语言的元编程功能通常较弱或实现不佳。
    • Montana:那些将其用于糟糕产品的人:Montana 是一个编译器基础设施,是[metap]的重要灵感来源,但因 IBM VisualAge 工具链糟糕而鲜为人知,之后虽有类似技术但很少引用 Montana。
    • 结语:文件观察器:元编程层引入需执行的东西,在 Python 中较麻烦,作者发现[File Watcher]可在保存元程序时运行[metap]。
  • 想参与讨论可前往Reddit,想获取更新可关注RSS feed或订阅 newsletter。
  • 脚注:

    • [1] 给出Dias的真实代码摘录。
    • [2] 介绍 C++的static if从 Dlang 引入及相关情况。
    • [3] 说明 C++模板的更多问题。
    • [4] 指出 Go 提供了创建代码转换工具的基础设施。
    • [5] 介绍 Russ Cox 及其与 Golang 的关系。
阅读 13
0 条评论