[PEAK] ZConfig and peak naming
Phillip J. Eby
pje at telecommunity.com
Fri Jul 30 10:54:02 EDT 2004
At 11:52 AM 7/30/04 +0200, Roché Compaan wrote:
>Roché Compaan wrote:
>>
>>Roché Compaan wrote:
>>
>>>* Phillip J. Eby <pje at telecommunity.com> [2004-07-29 23:20]:
>>>
>>>>Do something like this:
>>>>
>>>> class Process(binding.Component):
>>>> fileURL = binding.Require("URL needed",
>>>>adaptTo=naming.IStreamFactory)
>>>> file = binding.Obtain(naming.Indirect('fileURL'))
>>>>
>>>>And make the 'attribute' for 'file' be 'fileURL' instead.
>>>>
>>>>'naming.Indirect("some_name")' translates to, "use the object you find
>>>>at 'some_name' as a name to look up".
>>>
>>>
>>>
>>>Nice! Thanks a lot.
I goofed; the 'adaptTo=naming.IStreamFactory' should've been on 'file', not
'fileURL'.
>I just tried a couple of shorter permutations:
>
>class Process(...):
> ...
> fileURL = binding.Require("URL needed")
> file = binding.Obtain(
> naming.toName(naming.Indirect('fileURL'), FileURL.fromFilename),
> adaptTo=naming.IStreamFactory)
>
>raises:
> peak.exceptions.InvalidName: <peak.naming.names.Indirect object
> at 0x4070102c>
>
>Then I tried:
>
> file = binding.Obtain(
> naming.Indirect('fileURL'),
> adaptTo=[naming.IStreamFactory])
>
>protocols.adapters.AdaptationFailure: ("Can't adapt",
><peak.naming.factories.openable.FileFactory object at 0x404f8bcc>, [<class
>'peak.naming.interfaces.IStreamFactory'>])
Don't use '[]' on the adaptTo. It accepts only a single protocol, not a
list of protocols.
>Which is weird since, FileFactory's instances provide
>naming.IStreamFactory. Why does adaptation fail if the instance provides
>the correct interface?
>
>Ok, so looking at the error above, naming.Indirect('fileURL') already
>resolves to a FileFactory.
>
>Finally, just:
>
> file = binding.Obtain(naming.Indirect('fileURL'))
>
>worked! If I print "process.file" I correctly have a FileFactory. After
>looking at naming.Indirect and binding.Obtain it made sense though.
Yep, and if you add 'adaptTo=naming.IStreamFactory', that will also work in
cases where the URL doesn't directly create a stream factory, but can adapt
to one. (Not that I know of any such scenarios right now, I just generally
prefer to specify what interface I'm looking for when loading objects from
the naming system.)
More information about the PEAK
mailing list