[PEAK] ZConfig question
Phillip J. Eby
pje at telecommunity.com
Tue Jul 27 15:10:28 EDT 2004
At 08:41 PM 7/27/04 +0200, Roché Compaan wrote:
>* Phillip J. Eby <pje at telecommunity.com> [2004-07-27 18:22]:
> > You can also use [Named Services] to define the factory, so that the
> > will only be loaded once:
>I don't understand why it will only get loaded once? How is it different
>than to putting the factory in the peak.naming.factories section?
Normally, any property you define in an .ini file will be computed each
time it's asked for, and may thus be specific to the object you requested
the property for. So, if you define it in '[peak.naming.factories]',
you're just defining a regular property and it is computed each time it's
needed (unless explicitly cached elsewhere).
But '[Named Services]' lets you define properties that are global to an
entire service area. They are computed only once per service area, and
cached in the service area. They are in all other respects normal
configuration properties, it's just that they are only computed once and
relative to the service area, regardless of what object you asked it to be
>I noticed 'LinkRef' in peak.ini, but my URL omitted 'ref:'. I copied
>what is done with the 'EventDriven' shortcut.
'EventDriven' predates the 'ref:' mechanism, and uses the 'zconfig.schema:'
URL scheme, which was designed with a different purpose in
mind. Specifically, 'zconfig.schema' URLs create "interpreters" that are
designed to be used in a #! line of a ZConfig file, e.g.:
...zconfig data goes here...
>To be clear, how is
>"naming.LinkRef('ref:myapp.schema at ....')" different to
>"naming.LinkRef('myapp.schema at ...')"?
Well, the latter one simply isn't going to work, unless you are accessing
it in a naming context that assumes names to be 'ref:' URLs. :)
The 'ref:' URL scheme expects a factory name, and a list of '||'-separated
addresses. Such URLs are then interpreted as if they were Reference objects.
Your 'myapp.schema at ...' string is not a URL, however, since a URL must
begin with an alphanumeric scheme identifier and a colon. (Actually, the
RFCs allow '+', '-', '_' and '.' to appear in URL scheme identifiers, and
so does PEAK.)
Since it is not a URL, the naming system interprets it as a *name*, whose
interpretation is dependent on the context where you are looking it up. If
you are looking it up in a context that is initialized for 'ref:' URLs, it
will work as you expect. If you are looking it up in say,
"self.lookupComponent()", it's going to be interpreted as an attribute
path. If you looked it up in a 'mailto:' URL context, it might be
interpreted as an email address. :)
> > As you can see, though, this gains you little in this context, since you
> > still need to create a LinkRef so the URL can be looked up.
>But it is aesthetically pleasing to see everything as an URL ;-)
Perhaps, but since it's roughly the same amount of typing I prefer to be
explicit, and it takes *much* less computation to process a
'naming.Reference()' than the various steps needed to parse the LinkRef URL
and turn it into a Reference.
> > Incidentally, whether you use 'naming.Reference()' or the 'ref:' URL
> > scheme, you can use other URL schemes besides 'file:' as addresses. For
> > example, you can use 'pkgfile', which lets you refer to a file contained
> > inside a Python package directory, and you can even use http or ftp should
> > you have the need.
>Yes, I replaced the absolute filename with "pkgfile:jack/schema.xml":
> peak.naming.factories.myapp.schema = naming.LinkRef(
> 'ref:zconfig.schema at pkgfile:jack/schema.xml')
That's the idea, yes.
More information about the PEAK