Getting started
Core of the package is the wast.nodes
autogenerated module.
That’s where AST nodes are defined (very similar to those from stdlib ast
module).
By convention wast.nodes
is imported as w
to make accessing node classes easier.
Let’s generate our very first line of code:
>>> from wast import w, unparse
>>> unparse(w.Name('some_name')) # Name is a node for things like variable name
'some_name'
unparse()
is a function that turns wast tree into text with the code it represents (a single node also counts as a tree).
The opposite function is called parse()
>>> from wast import _, w, unparse
>>> attrib = w.Attribute(value=w.Name('some_name'), attr='my_attr')
>>> unparse(attrib)
'some_name.my_attr'
>>> unparse(_.some_name.my_attr)
'some_name.my_attr'
Any language construct (assignment, class definition, subscription) can be represented using corresponding node from wast.nodes
.
In case of most statements and very simple expressions it’s totally OK to use those nodes as is
(with defaults, validation and shortcuts still being a major improvement over stdlib ast
)
But a simple attribute access already lookes very unreadable, and here is where magic underscore comes into play. It’s just a helper for building expressions, and can express most (but not all) kinds of expressions. The underscore is an object with some overloads to use it as “expression root”
Here is a more involved example:
>>> from wast import _, unparse
>>> expr = _.my_fn(arg1=_.some_list[_.index]) + _.other_obj.user.email + _["some_string"]
>>> print(unparse(expr))
my_fn(arg1=some_list[index]) + other_obj.user.email + 'some_string'