From: Ted H. <ted...@ea...> - 2009-12-18 14:03:13
|
On 2009-12-18, at 05:28, Francesc Alted wrote: > A Friday 18 December 2009 11:54:49 Maarten Sneep escrigué: >> On 18 dec 2009, at 11:43, Francesc Alted wrote: >>> Hi List, >>> >>> I'm about to merge the links branch into trunk, but suddenly it >>> occurred >>> to me a new idea on how to dereferring soft/external links. >>> Currently, >>> these links work like this: >>> >>> f = tb.openFile('links.h5', 'w') >>> g = f.createGroup('/', 'g') >>> a1 = f.createCArray(g, 'a', tb.Int64Atom(), shape=(10000,)) >>> la = f.createSoftLink('/', 'la', '/g/a') # /la points to /g/a >>> >>> and dereferring la is implemented via the `__call__()` method: >>> >>> a2 = la() # a2 is the 'a' CArray >>> >>> But I think now that perhaps it would be better to implement >>> dereferencing via a property (say `target`): >>> >>> a2 = la.target # a2 is the 'a' CArray >>> >>> That would allow to natural naming to work even through links >>> referring >>> to groups. For example, if lg >>> >>> lg = f.createSoftLink('/', 'lg', '/g') # /lg points to /g >>> >>> then we could do: >>> >>> a3 = f.root.lg.target.a # a3 is the 'a' CArray >>> >>> which I think is consistent with the way that PyTables uses to >>> access >>> nodes. What people think? >> >> Hi, >> >> Do it in a way that doesn't require me to know if it is a link or >> not, >> group or otherwise. Of course when writing you will know, but not >> when >> using. I think that means I prefer the first method. > > Thanks for your feedback Maarten. > > Hard links already implement your suggested way that doesn't require > to know > if it is a link or not (in fact, hard links are just meant for > providing > different paths to the same node). However, soft and external links > *do* need > to have a different personality than the nodes they point to. This > is because > you need to know that, say, '/path/to/node' is a link or not in > order to know > the different instance variable or methods that you can use. > >> In addition you can add a property to manipulate the link itself, >> but not >> for normal use of the data. > > Unfortunately, I think I cannot go the property venue. In the > middle of the > property implementation I realized that an external link needs a way > to pass > parameters to the dereferring method. For example, if: > > la = f.createExternalLink('/', 'lg', 'externalfile.h5:/g') > > then we can derefer the link is several ways: > > la() # open external file in 'r'ead-only mode (default) > la('a') # open external file in 'a'ppend mode > la(METADATA_CACHE_SIZE=2**24) # open external file with specific > param > > And as it would be desirable to have the same interface for soft and > external > links, then I think I'll stick with the special `__call__` method > for the > moment. > If __call__ means 'open', then wouldn't it be clearer (more explicit) to just have a method named open? > Sorry for the noise, > > -- > Francesc Alted > Ted |