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.*,我在这个项目中永远不会使用。在

摩梭

BuildSupportcodecov

一个用纯python实现的高级语法扩展系统。在

pip install -U moshmosh-base --no-compile

请注意,--no-compile是必需的。在

预览

与IPython合作

你应该复制moshmosh_ipy.py$USER/.ipython/profile_default/startup/。在

如果此目录不存在,请使用命令ipython profile create实例化。在

关于模式匹配、管道和快速lambdas的一些示例:

IPython example 1

关于作用域运算符的一些示例:

IPython example 2

使用常规Python文件

在主模块中导入moshmosh

Main.py

然后,在mypackage.py中,用pragma注释# moshmosh?开始编码,然后可以使用moshmosh扩展系统。在

Upack.py

案例研究:模式匹配

介绍了源于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时导入模块。在

当你想要的时候,这个用例是关于必要的交叉导入的 以更细粒度的方式组织代码库。在

致谢

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java通过嵌套数组将任何结构的xml转换为json   java注释的处理发生在哪里?   java CAS Rest API始终导致HTTP状态415   JavaSwing模拟进程运行选择排序   在Java程序中获得意外输出   确保后端服务oAuth安全的java正确方法   java Query在尝试按日期删除时不会生成结果集。   Java ScheduledExecutorService和Quartz Scheduler之间最好使用什么?   java Pascals三角形在一个循环中   java从mssql到Eclipse获取数据   基于opencv的java颜色检测   java XMLUnit 2.3和忽略某些标记中的比较   java如何在Selenium中只跳过一个方法   用java加载图像(eclipse与IntelliJ)