使用 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 校验的库什么的;美中不足的是它可能会导致类型检查的程序崩溃。