On 16 July 2013 23:39, R. David Murray <rdmur...@bitdance.com> wrote:
> On Tue, 16 Jul 2013 23:19:21 +1000, Steven D'Aprano <st...@pearwood.info> 
> wrote:
>> On 16/07/13 20:28, Richard Oudkerk wrote:
>> > On 16/07/2013 6:44am, Nick Coghlan wrote:
>> >> Clarifying what constitutes an internal interface in a way that
>> >> doesn't require renaming anything is a necessary prerequisite for
>> >> bundling or bootstrapping the pip CLI in Python 3.4 (as pip exposes
>> >> its internal implemetnation API as "import pip" rather than "import
>> >> _pip" and renaming it would lead to a lot of pointless code churn).
>> >> Without that concern, the topic never would have come up.
>> >
>> > BTW, how does the use of __all__ effect things?  Somewhere I got the idea 
>> > that if a module uses __all__ then anything not listed is internal.  I 
>> > take it that is wrong?
>>
>>
>> That is not how I interpret __all__. In the absence of any explicit 
>> documentation, I interpret __all__ as nothing more than a list of names 
>> which wildcard imports will bring in, without necessarily meaning that other 
>> names are private. For example, I might have a module explicitly designed 
>> for wildcard imports at the interactive interpreter:
>>
>> from module import *
>>
>> brings in the functions which I expect will be useful interactively, not 
>> necessarily the entire public API.
>>
>> For example, pkgutil includes classes with single-underscore methods, which 
>> I take as private. It also has a function simplegeneric, which is 
>> undocumented and not listed in __all__. In in the absence of even a comment 
>> saying "Don't use this", I take it as an oversight, not policy that 
>> simplegeneric is private.
>
> I think you'd be wrong about that, though.  simplegeneric should really be
> treated as private.  I'm speaking here not about the general principle of
> the thing, but about my understanding of simplegeneric's specific history.

And, indeed, you're correct (the issue that eventually became the
functools.singledispatch PEP started life with a title like "move
simplegeneric to functools and make it public").

For the general case, the patch I posted to the issue tracker sets the
precedence as docs -> __all__ -> leading underscore. If a module has
public APIs that aren't in __all__, it should cover them in the docs,
otherwise people should assume they're private. It's OK if there are
exceptions to that general rule - there's a reason PEP 8 has the great
big qualifier pointing out that it isn't universally applicable (even
if we might sometimes wish otherwise).

Cheers,
Nick.

--
Nick Coghlan   |   ncogh...@gmail.com   |   Brisbane, Australia
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to