At 01:53 PM 12/29/03 -0500, Fred L. Drake, Jr. wrote:

Phillip J. Eby writes:
 > That reminds me...  is there any way for section *names* to be
 > case-sensitive, or at least case-preserving?  For example, if one were
 > simulating Apache-style configuration like:

There isn't, but there was at some point.  Nobody here at ZC seemed to
think it useful at the time, so it was removed as a simplification.

What we had was a "nametype" attribute for <sectiontype> elements; it
was just another datatype function.

I'd be happy to have that back if there's a real use for it.  The
current situation, where the conversion is coded directly in
ZConfig.cfgparser, isn't very flexible.

Agreed. :)

Would it suit your requirements if the name type were associated with
the section type, and inherited from the base type if not specified?


 > Currently, IIRC, the '_name' attribute of the resulting section will be
 > '/foo/bar/baz'.

The _name attribute is an implementation detail; use the
getSectionName() method instead.  I'm likely to change the _name
detail just to be facetious.  ;-)

Well, in that case, can we have a 'getItems()' that returns only the key-value pairs for actual attributes, and does *not* include keys for values that weren't explicitly specified in the configuration file and don't have defaults?

In PEAK, the binding.Component class has this constructor currently:

def fromZConfig(klass, section):

"""Classmethod: Create an instance from a ZConfig 'section'"""

        # ZConfig uses unicode for keys and defaults unsupplied values to None
        data = dict([(str(k),v) for k,v in section.__dict__.items()
            if v is not None])

        if not hasattr(klass,'_name') and '_name' in data:
            del data['_name']

        if not hasattr(klass,'_matcher') and '_matcher' in data:
            del data['_matcher']

return klass(**data)

As you can see, I'm doing a fair amount of work in order to extract a mapping I can use as keyword arguments for the regular constructor. The standard way in PEAK to make a component configurable by ZConfig is simply to specify "whatevertype.fromZConfig" as the "datatype" in the ZConfig schema.

If there were a 'getMapping' method available, the above would become something like:

def fromZConfig(klass, section):

"""Classmethod: Create an instance from a ZConfig 'section'"""

        data = dict([(str(k),v) for k,v in section.getItems()]
        data['_name'] = section.getSectionName()
        return klass(**data)

Unless of course the keys were strings rather than Unicode, in which case it'd be even simpler. (The issue here is that Python requires keyword arguments to be strings rather than Unicode, even though attribute names can be Unicode. ZConfig sets attributes using unicode because ZConfig schemas are XML, and therefore Unicode.)

Zope-Dev maillist - [EMAIL PROTECTED]
** No cross posts or HTML encoding! **
(Related lists - )

Reply via email to