Proposal for new operators to python that add syntactic sugar for hierarcical data.
Diez B. Roggisch
deets at nospam.web.de
Wed May 17 18:07:58 EDT 2006
glomde schrieb:
> i I would like to extend python so that you could create hiercical
> tree structures (XML, HTML etc) easier and that resulting code would be
> more readable than how you write today with packages like elementtree
> and xist.
> I dont want to replace the packages but the packages could be used with
> the
> new operators and the resulting IMHO is much more readable.
>
> The syntax i would like is something like the below:
>
> # Example creating html tree
>
> '*!*' is an operator that creates an new node,
> '*=*' is an operator that sets an attribute.
>
> So if you take an example to build a smalle web page
> and compare with how it looks with in element tree now
> and how it would look like when the abover operators would exist.
>
> With element tree package.
>
> # build a tree structure
> root = ET.Element("html")
> head = ET.SubElement(root, "head")
> title = ET.SubElement(head, "title")
> title.text = "Page Title"
> body = ET.SubElement(root, "body")
> body.set("bgcolor", "#ffffff")
> body.text = "Hello, World!"
>
>
>
> With syntactical sugar:
>
> # build a tree structure
> root = ET.Element("html")
> *!*root:
> *!*head("head"):
> *!*title("title):
> *=*text = "Page Title"
> *!*body("body"):
> *=*bgcolor = "#ffffff"
> *=*text = "Hello, World!"
>
>
>
> I think that with the added syntax you get better view of the html
> page.
> Repeating things dissapears and you get indentation that corresponds to
> the tree.
> I think it is very pythonic IMHO.
>
> It could be done quite generic. If the variable, object after '*!*'
> must support append
> method and if you use '*=*' it must support __setitem__
>
> Any comments?
It's ugly, and could easily achieved using the built-in tupels, lists
and dictionaries together with a simple traversing function.
Like this (untested):
class Node(object):
def __init__(self, value):
self.value = vallue
self._childs = []
def append(self, child):
self._childs.append(child)
t = ('root',
('child1,
('grandchild', ()),
'child2',
()
)
)
def create_node(t):
value, childs = t
n = Node(value)
if childs:
for ch in childs:
n.append(create_node(ch))
return n
IMHO that tuple-based tree is waaay more readable than your proposal -
and no need to come up with new syntax.
Diez
More information about the Python-list
mailing list