Nicolas Fleury wrote: > Steven Bethard wrote: >> Ok, I finally have a PEP number. Here's the most updated version of >> the "make" statement PEP. I'll be posting it shortly to python-dev. >> >> Thanks again for the previous discussion and suggestions! > > I find it very interesting. > > My only complaint is that it is limited to things that can be described > as a namespace, where the order of declaration is lost. This problem is > also true with metaclasses, but it is more acceptable since they are for > classes.
Yep, this seems to be the biggest complaint. I'm waiting for write access to the repository, but here's a clip from the upcoming update: Open Issues =========== ... Should users of the make statement be able to determine in which dict object the code is executed? The make statement could look for a ``__make_dict__`` attribute and call it to allow things like:: make Element html: make Element body: make Element h1: '''First heading text''' make Element h1: '''Second heading text''' where a normal dict object would not suffice since order and repeated names must be allowed. Assuming that the ``__make_dict__`` attribute was called to get the dict in which the block should be executed, the following code should make the above make statements work:: class Element(object): class __make_dict__(dict): def __init__(self, *args, **kwargs): self._super = super(Element.__make_dict__, self) self._super.__init__(*args, **kwargs) self.values = [] def __getitem__(self, name): try: return self._super.__getitem__(name) except KeyError: return globals()[name] def __setitem__(self, name, value): self._super.__setitem__(name, value) if not name.startswith('__'): self.values.append(value) def __new__(cls, name, args, edict): result = etree.ElementTree.Element(name) result.text = edict.pop('__doc__', None) print edict.values for element in edict.values: result.append(element) return result STeVe -- http://mail.python.org/mailman/listinfo/python-list