[Python-Dev] ConfigParser shootout, preliminary entry

exarkun at divmod.com exarkun at divmod.com
Mon Oct 18 23:39:47 CEST 2004


On Mon, 18 Oct 2004 15:52:03 -0400, Bob Ippolito <bob at redivi.com> wrote:
>On Oct 18, 2004, at 15:20, Josiah Carlson wrote:
> 
> [snip]
> >
> > I'm not saying that they can't be numbered, I'm saying that one cannot
> > discover the ordering of assignment of attr1 and attr2 in the 
> > following:
> >
> > class foo:
> >     attr1 = value1
> >     attr2 = value2
> >
> > If there is a mechanism for discovering the original ordering of those
> > assignments, there are a group of users in c.l.py who would like to 
> > know,
> > and Carlos' seemingly non-existant implementation could also use it.
> 
> That is true, but you do know that the expression value1 is evaluated 
> before the expression value2, so it is possible to sort later for 
> clever enough choices of value1 and value2.  Since his proposed syntax 
> invokes something for each attribute, then this trick can certainly be 
> used.. here's a small demonstration:
> 
> from itertools import count
> 
> class Value(object):
>      def __init__(self, value, serial=count()):
>          self.serial = serial.next()
>          self.value = value
> 
> class Container(object):
>      class __metaclass__(type):
>          def __new__(cls, name, bases, dct):
>              sorted = filter(lambda (k,v): isinstance(v, Value), 
> dct.iteritems())
>              sorted.sort(lambda (ka,va),(kb, vb): cmp(va.serial, 
> vb.serial))
>              dct['sorted'] = sorted
>              return type.__new__(cls, name, bases, dct)
> 
> class MyContainer(Container):
>      p = Value(2)
>      y = Value(0)
>      t = Value(-1)
>      h = Value(20)
>      o = Value('x')
>      n = Value('z')

  This breaks down for the perfectly reasonable case of:

    hostname = Value("foo")

    class First(Container):
        port = Value(64)
        hostname = hostname
        username = Value("zoop")

    class Second(Container):
        username = Value("pooz")
        hostname = hostname
        port = Value(24)

  ie, it breaks down as soon as you try to re-use anything, which is quite surprising to the unsuspecting user, and pretty unfortunate even once you do understand why.

  Jp


More information about the Python-Dev mailing list