api stability
Robert Collins
robertc at robertcollins.net
Thu Jan 5 06:18:20 GMT 2006
On Thu, 2006-01-05 at 16:38 +1100, Martin Pool wrote:
> On Tue, 2005-12-20 at 13:56 +1100, Robert Collins wrote:
> > On Mon, 2005-12-19 at 20:28 -0600, John Arbash Meinel wrote:
>
> > 'symbol' : Is a public symbol.
> > '_symbol' : Is a private symbol to whatever context it appears in. If
> > that context is publicly extensible then its public [for extensions
> > only].
> > Specifically, _foo symbols in module scope are private.
> > _foo symbols in class scope where the class
> > is named like 'Foo' are public for child classes.
> > _foo symbols in class scope where the class is named
> > like '_Foo' are private because the class is
> > private and extension is not publically supported.
>
> This is OK but I'm not totally happy with it: there is a bit of a gap
> between __name (which Python tries to hide from all subclasses), and
> allowing things to be used by subclasses. In particular this implies
> that data fields can be relied upon by subclasses, which is going too
> far.
Uhm, this is confusing to me: we had __foo for things that are not
allowed to be used by subclasses, and _foo for things that are allowed
to be used by subclasses. If you have a data field that is not allowed
to be relied upon by the subclass, call it __foo.
> Perhaps we should change this to just say that only 'symbol' names can
> are public, even when subclassing. So classes that are intended to be
> subclassed in particular ways need to expose with unprefixed names the
> symbols needed to define and implement the subclass.
I dont think so, that would force the exposure of class internals in
common subclass cases.
> I would think only some particular classes need to be subclassed, and
> it's better to think about which behaviours should be guaranteed, rather
> than potentially promising that none of the internal behaviour will
> change.
Eh? I'm *positive* you misread something. That was not implied or stated
at all.
> > Exceptions
> > ----------
> > Any exception that is raised by a public symbol in bzrlib and is a plain
> > python exception is a private symbol.
> >
> > All other exceptions are classified as per the symbol classification
> > guidelines above.
>
> I agree, but it's also important for callers to know what exceptions
> they can expect to be raised. In particular, if they want to detect a
> particular error case, what exception can they expect will be raised to
> indicate it. (Secondarily, if defining a subclass, what exception
> should they raise when the subclass hits an error?)
>
> There are three ways they might expect to know this
>
> 0 - because we explicitly say "when foo occurs, raises FooException"
> 1 - by looking at the implementation
> 2 - by trying it and observing what happens
>
> I don't think any behaviour implied by 1 or 2 will necessarily be
> supported in the long term as the code evolves. Therefore I think
> callers can only rely on particular exceptions being thrown if the
> documentation says that will happen. And similarly when implementing
> subclasses.
>
> It may seem like this will cause a lot of documentation of exceptions,
> but remember that it is a rare (exceptional!) case to want to catch a
> particular exception. The documentation could be done at a class,
> module or global level, rather than on every single method/function that
> could raise it.
>
> As you say there are two main types: plain Python exceptions, and
> exceptions that descend from BzrException. (I don't think they should
> need to be named Bzr*). In general we should be raising BzrException,
> as in the HACKING guide. The contents of the BzrException are subject
> to the visibility rules above.
Sure - the point was that non BzrException subclasses would *never* be
raised as part of our api.
Rob
--
GPG key available at: <http://www.robertcollins.net/keys.txt>.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : https://lists.ubuntu.com/archives/bazaar/attachments/20060105/9e7be29d/attachment.pgp
More information about the bazaar
mailing list