On 2011-07-22 14:32, Joshua Immanuel wrote: > Hello, > > On Fri, 2011-07-22 at 13:41 +0200, Jacob Holm wrote: >> On 2011-07-22 13:26, Brian Sutherland wrote: >>> This would be my first guess: >>> >>> class INode(Interface): >>> pass >>> >>> INode.parent = Object( >>> title=u"Parent node", >>> schema=INode >>> ) >>> >>> INode.children = List( >>> title=u'Child nodes', >>> value_type=Object(schema=INode) >>> ) >>> >> > > The method suggested by Brian works without any issues. :) >
It "works" only in the the sense that it doesn't throw an exception. It does not define the desired schema. >> >> And that guess would be wrong. You can't add fields to an existing >> schema like that (not sure if you can in other ways). You *can* >> change >> an existing field however, so a working solution would be: >> >> class INode(Interface): >> >> parent = Object( >> title = u'Parent node', >> schema = Interface, # set to INode later >> ) >> >> children = List( >> title = u'Child nodes', >> value_type = Object(schema=Interface), >> ) >> >> INode['parent'].schema = INode >> INode['children'].value_type.schema = INode > > I thought this also should work without any issues. Trust me, it does. > But when I ran the > debug shell to list out the attributes of INode using dir(INode) I > couldn't find the 'parent' and 'children' attributes in it. The fields of the schema are not *supposed* to show up in "dir()". Despite the use of the "class" statement to define them, interfaces are *not* classes. They are instances of zope.interface.interface.InterfaceClass, and act like (read-only) containers of their fields. Try using 'list(Inode)' for testing and you will see that "my" method works as expected. > Even worse > part is, if there is another field say > > name = TextLine(title=u'Node name') > > This 'name' attribute is also is not visible along with 'parent' and > 'children' attributes. > > Can someone explain why is this so? > Right. As explained above, it isn't supposed to. > (Even though the problem gets solved by Brian's method, just curious to > know) > I hope to have convinced you by now that it really isn't solved by Brian's method, but by mine. (Although I wouldn't call it "my" method as such. I'm sure I have taken it from somewhere else) - Jacob _______________________________________________ bluebream mailing list [email protected] https://mail.zope.org/mailman/listinfo/bluebream
