On Tue, May 25, 2021 at 9:36 PM Steven D'Aprano <st...@pearwood.info> wrote:

> > ALLCAPS means "this value should only be set once and not changed."
>
> `math.pi` says hello.
>

(U ⇒ O) ⊬ (¬U ⇒ ¬O)

The existence of math.pi and the fact that probably nobody ever has
> introduced a bug into their code by carelessly assigning another value
> to it suggests strongly that the benefit of language enforced constants
> is not high.
>

Well, rarely.  I've once or twice carelessly tested or taught some
iterative algorithm for generating pi and made the error of overwriting the
name.

In this particular example, and also math.e and math.tau, the lowercase
follows external conventions.  From time to time other such mathy constants
too.  But the UPPERCASE constants are pretty darn common, pre-dating Python.


> > _underscore means "this is not part of public API, and it may change in
> next version.
>
> Namedtuple and the sys module also say hello.
>

Yeah. There are a few exceptions.

I'll note... perhaps *confess*... that even though I was literally sitting
at the desk next to Raymond when he was thinking about the design of
namedtuple, and even discussed it with him slightly, I had assumed for more
years than I wish to mention that ._asdict and ._fields were not strictly
promised because of their names.


> > __double_under means "this is SERIOUSLY not something you should muck
> with,
> > it's likely to break stuff if you do."
>
> That's a convention I've never heard of before. What's the difference
> between "private" and "SERIOUSLY private, I REALLY mean it"?
>

In classes, it's name mangling.  I've found that most people, or most code
I've seen, treat module or function level `__double` names as implicitly
similar.  That's certainly what I do myself.  If I don't want someone to
rely on a name in future versions of some module, I'll use the single
underscore.  If I want to warn them that relying on it might cause bad
things even right now, in this version, I'll use the double
leading-underscore.

Obviously it's not enforced at a language level. But it's a pretty good
clue for other users.


> The problem with naming conventions is that not everyone knows the
> conventions. Not every Python programmer spends hours every day on
> Python forums, reading Stackoverflow, etc. What you call "a B&D language
> like Java", other people might call "safety rails and warning lights".
>

It seems like a documentation question then. PEP 8 describes it as:

   - _single_leading_underscore: weak "internal use" indicator. E.g. from M
   import * does not import objects whose names start with an underscore.

-

__double_leading_underscore: when naming a class attribute, invokes name
mangling
-

__double_leading_and_trailing_underscore__: "magic" objects or attributes
that live in user-controlled namespaces. E.g. __init__, __import__ or
__file__. Never invent such names; only use them as documented.
It's not 100% explicit about double underscore meaning "I REALLY mean it"
... but it's kinda implied in the contrast with single underscore.

-- 
The dead increasingly dominate and strangle both the living and the
not-yet born.  Vampiric capital and undead corporate persons abuse
the lives and control the thoughts of homo faber. Ideas, once born,
become abortifacients against new conceptions.
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/Z6AHNL5NO4ECHT5CKOIR73ROLXMCKNOR/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to