Python S-expression emulation using tuple-like objects.
Project description
etuples
Python S-expression emulation using tuple-like objects.
Examples
etuple
s are like tuples:
>>> from operator import add
>>> from etuples import etuple, etuplize
>>> et = etuple(add, 1, 2)
>>> et
ExpressionTuple((<built-in function add>, 1, 2))
>>> from IPython.lib.pretty import pprint
>>> pprint(et)
e(<function _operator.add(a, b, /)>, 1, 2)
>>> et[0:2]
ExpressionTuple((<built-in function add>, 1))
etuple
s can also be evaluated:
>>> et.eval_obj
3
Evaluated etuple
s are cached:
>>> et = etuple(add, "a", "b")
>>> et.eval_obj
'ab'
>>> et.eval_obj is et.eval_obj
True
Reconstructed etuple
s and their evaluation results are preserved across tuple operations:
>>> et_new = (et[0],) + et[1:]
>>> et_new is et
True
>>> et_new.eval_obj is et.eval_obj
True
rator
, rands
, and apply
will return the operator, the operands, and apply the operation to the operands:
>>> from etuples import rator, rands, apply
>>> et = etuple(add, 1, 2)
>>> rator(et)
<built-in function add>
>>> rands(et)
ExpressionTuple((1, 2))
>>> apply(rator(et), rands(et))
3
rator
and rands
are multipledispatch
functions that can be extended to handle arbitrary objects:
from etuples.core import ExpressionTuple
from collections.abc import Sequence
class Node:
def __init__(self, rator, rands):
self.rator, self.rands = rator, rands
def __eq__(self, other):
return self.rator == other.rator and self.rands == other.rands
class Operator:
def __init__(self, op_name):
self.op_name = op_name
def __call__(self, *args):
return Node(Operator(self.op_name), args)
def __repr__(self):
return self.op_name
def __eq__(self, other):
return self.op_name == other.op_name
rands.add((Node,), lambda x: x.rands)
rator.add((Node,), lambda x: x.rator)
@apply.register(Operator, (Sequence, ExpressionTuple))
def apply_Operator(rator, rands):
return Node(rator, rands)
>>> mul_op, add_op = Operator("*"), Operator("+")
>>> mul_node = Node(mul_op, [1, 2])
>>> add_node = Node(add_op, [mul_node, 3])
etuplize
will convert non-tuple objects into their corresponding etuple
form:
>>> et = etuplize(add_node)
>>> pprint(et)
e(+, e(*, 1, 2), 3)
>>> et.eval_obj is add_node
True
etuplize
can also do shallow object-to-etuple
conversions:
>>> et = etuplize(add_node, shallow=True)
>>> pprint(et)
e(+, <__main__.Node at 0x7f347361a080>, 3)
Installation
Using pip
:
pip install etuples
To install from source:
git clone git@github.com:pythological/etuples.git
cd etuples
pip install -r requirements.txt
Tests can be run with the provided Makefile
:
make check
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file etuples-0.2.0.tar.gz
.
File metadata
- Download URL: etuples-0.2.0.tar.gz
- Upload date:
- Size: 22.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.2.0.post20200210 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 457f4eaf3742a240c5d32d6fac8627ea541ebf27b71058cbbce86d5fd7e9d0b9 |
|
MD5 | 9ac73b44d007853ebd02a84b263a3800 |
|
BLAKE2b-256 | 1085841f8146419874c1d1daa8f87dcd64d3db718db262aeec56c58e95501232 |
File details
Details for the file etuples-0.2.0-py3-none-any.whl
.
File metadata
- Download URL: etuples-0.2.0-py3-none-any.whl
- Upload date:
- Size: 11.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.2.0.post20200210 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 60ccdc10c0360c0157467a4bcadc2803201154b3f4fcf75f3fd98015d61a3855 |
|
MD5 | 1de52c7be0bfa6771a229fec88af71e3 |
|
BLAKE2b-256 | 56898cecf2f1eb6987958cf76b4801696e0749ddbf719ec8fbd448cf2a1c2d0f |