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 的关系。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。