使用 Python Annotation 编写宏代码

查看原文

这位同学通过滥用 python annotation 语法来完成动态编程。其基本原理是,Python annotations 的数据存储在实例的 __annotation__ 这个 dict 中,而它其实并不限制类型数据一定要是类型,也可以是任何合法的 Python 表达式。例如

@inrange
class MyClass:
    var: "0 < var < 1"

这个 var 通常会需要写成一种类似 var: ZeroToOneIntegerClass 这样的语法,但是通过 @inrange 解析这个字符串动态生成了如下代码:

class MyClass:
    var: "0 < var < 1"

    def __init__(self):
        self._var = None

    @property
    def var(self):
        return self._var

    @var.setter
    def var(self, new_value):
        if (0 < new_value) and (new_value < 1):
            self._var = new_value

衍生思考:语言设计者可能没有想到会被这样子用,说不定会有不少好玩的库被发明出来,例如 form 校验的库什么的;美中不足的是它可能会导致类型检查的程序崩溃。