Python高级语法语义扩展系统
moshmosh-base的Python项目详细描述
首先
The awareness of low-level implementation details brings the appreciation of an abstraction and the intuitive explanation for it.
这是我偶像在Programming Language领域的一句话。在
我把它呈现在这里,以防有人预先判断这个项目的可靠性。在
对于任何可靠的CPYTHON发行版中支持的所有第三方库,此项目在任何受支持的PYTHON版本下都能完美地工作。在
除了简单的静态代码分析和ast转换之外,没有任何黑客攻击,而且黑客攻击通常包含inspect.*
,我在这个项目中永远不会使用。在
摩梭
一个用纯python实现的高级语法扩展系统。在
pip install -U moshmosh-base --no-compile
请注意,--no-compile
是必需的。在
预览
与IPython合作
你应该复制moshmosh_ipy.py
到$USER/.ipython/profile_default/startup/
。在
如果此目录不存在,请使用命令ipython profile create
实例化。在
关于模式匹配、管道和快速lambdas的一些示例:
关于作用域运算符的一些示例:
使用常规Python文件
在主模块中导入moshmosh
:
然后,在mypackage.py
中,用pragma注释# moshmosh?
开始编码,然后可以使用moshmosh扩展系统。在
案例研究:模式匹配
介绍了源于Python ideas邮件列表的匹配协议, 这意味着您可以方便地定义自己的模式。 链接是here。在
^{pr2}$注意,匹配的条款应该是详尽的,
否则,moshmosh.extensions.pattern_matching.runtime.NotExhaustive
可能会被养大。在
这里列出了支持的模式,即 当然比大多数编程语言强大得多。在
- 和模式:
pat1 and pat2 and pat3 ...
- 或模式:
pat1 or pat2 or pat3...
- Pin模式:
pin(value)
,这非常有用。见Elixir Pin Operator - 文字模式:
1, "str", 1+2j, (1, 2)
- 作为模式:
a, var
- 通配符:
_
- 守卫:
when(cond1, cond2, cond3)
- 嵌套模式:
- 元组:
(pat1, pat2, pat3), (pat1, *pat2, pat3)
- 列表:
[pat1, pat2, pat3], [pat1, *pat2, pat3]
- 识别器:
Cons(pat1, pat2, pat3)
,注意, 函数Cons.__match__(<n arg>, value_to_match)
正是协议。在
- 元组:
模式匹配应该比那些没有的手写代码更有效 丑陋的优化。在
此外,Moshmosh的模式匹配比 任何其他选择。在
案例研究:模板Python
这是一个相对简单的准IQoote实现,受MetaOCaml启发。 它不支持手动拼接或嵌套引用,但支持函数参数 自动拼接。在
# moshmosh?# +template-python@quotedeff(x):x+1x=y+1frommoshmosh.ast_compatimportastfromastprettyimportpprintstmts=f(ast.Name("a"))pprint(ast.fix_missing_locations(stmts[0]))pprint(ast.fix_missing_locations(stmts[1]))# =>Expr(lineno=7,col_offset=4,value=BinOp(lineno=7,col_offset=4,left=Name(lineno=7,col_offset=4,id='a',ctx=Load()),op=Add(),right=Num(lineno=7,col_offset=8,n=1),),)Assign(lineno=8,col_offset=4,targets=[Name(lineno=8,col_offset=4,id='a',ctx=Store())],value=BinOp(lineno=8,col_offset=8,left=Name(lineno=8,col_offset=8,id='y',ctx=Load()),op=Add(),right=Num(lineno=8,col_offset=12,n=1),),)
案例研究:惰性导入
# moshmosh?# +lazy-importimportnumpyasnp# -lazy-import# in fact numpy is not imported here,# and once you use it, it gets imported.defarr10():# The first time call# arr10 will enforce the import of numpy.returnnp.zeros(10)
在实际导入lazy模块之后,有 没有访问他们的成员的开销。在
但是,请仅在使用lazy-import
时导入模块。在
当你想要的时候,这个用例是关于必要的交叉导入的 以更细粒度的方式组织代码库。在
致谢
- future-fstrings
- Python中的模式匹配
- older implementations
- 在Python-ideas处搜索“模式匹配”。在
- 项目
标签: