使用tuplelike对象的Python Sexpression仿真。
etuples的Python项目详细描述
etuples
PythonS-expression模拟使用类似元组的对象。在
示例
etuple
s类似于元组:
>>>fromoperatorimportadd>>>frometuplesimportetuple,etuplize>>>et=etuple(add,1,2)>>>etExpressionTuple((<built-infunctionadd>,1,2))>>>fromIPython.lib.prettyimportpprint>>>pprint(et)e(<function_operator.add(a,b,/)>,1,2)>>>et[0:2]ExpressionTuple((<built-infunctionadd>,1))
etuple
s也可以计算:
计算的etuple
被缓存:
>>>et=etuple(add,"a","b")>>>et.eval_obj'ab'>>>et.eval_objiset.eval_objTrue
重构的etuple
及其求值结果跨元组操作保存:
>>>et_new=(et[0],)+et[1:]>>>et_newisetTrue>>>et_new.eval_objiset.eval_objTrue
rator
、rands
和{
>>>frometuplesimportrator,rands,apply>>>et=etuple(add,1,2)>>>rator(et)<built-infunctionadd>>>>rands(et)ExpressionTuple((1,2))>>>apply(rator(et),rands(et))3
rator
和rands
是^{
frometuples.coreimportExpressionTuplefromcollections.abcimportSequenceclassNode:def__init__(self,rator,rands):self.rator,self.rands=rator,randsdef__eq__(self,other):returnself.rator==other.ratorandself.rands==other.randsclassOperator:def__init__(self,op_name):self.op_name=op_namedef__call__(self,*args):returnNode(Operator(self.op_name),args)def__repr__(self):returnself.op_namedef__eq__(self,other):returnself.op_name==other.op_namerands.add((Node,),lambdax:x.rands)rator.add((Node,),lambdax:x.rator)@apply.register(Operator,(Sequence,ExpressionTuple))defapply_Operator(rator,rands):returnNode(rator,rands)
>>>mul_op,add_op=Operator("*"),Operator("+")>>>mul_node=Node(mul_op,[1,2])>>>add_node=Node(add_op,[mul_node,3])
etuplize
将把非元组对象转换成相应的etuple
形式:
>>>et=etuplize(add_node)>>>pprint(et)e(+,e(*,1,2),3)>>>et.eval_objisadd_nodeTrue
etuplize
还可以执行浅对象到-etuple
转换:
>>>et=etuplize(add_node,shallow=True)>>>pprint(et)e(+,<__main__.Nodeat0x7f347361a080>,3)
安装
使用pip
:
pip install etuples
从源安装:
git clone git@github.com:pythological/etuples.git
cd etuples
pip install -r requirements.txt
可以使用提供的Makefile
运行测试:
make check
- 项目
标签: