Qual é a razão histórica pela qual Python usa o sublinhado duplo para membros de Classe Privada

8

Em python, uma função ou variável privada do módulo é nomeada _foo. Se é privado para uma classe, são nomes __foo. A mecânica por trás de como esses trabalhos são diferentes, porém isso é de pouca relevância para a questão.

Por que, durante o design da linguagem Python, os caracteres sublinhados duplos foram escolhidos para os membros privados da classe? Por que não um sublinhado único, como no módulo privado? Por que não outro personagem que é mais visível? (Diferenciar _ e __ é difícil).

Tenho certeza de que existe alguma história aqui, mas estou tendo problemas para encontrá-la, porque tudo o que encontro são tutoriais que me dizem o que isso significa, e não por que é assim.

Lyndon White
fonte
Não estou interessado em discutir se foi ou não uma boa escolha, apenas em conhecer a história.
Lyndon White
1
Os sublinhados únicos não são especificamente para itens particulares do módulo; eles também são usados ​​para os membros privados de uma classe. A diferença entre os sublinhados simples e duplos é apenas o nome incorreto, que geralmente é desnecessário ou até prejudicial nas classes.
"No python, uma função ou variável privada do módulo é nomeada _foo ..." isso está errado: veja aqui python.org/dev/peps/pep-0008/#descriptive-naming-styles . Em poucas palavras, os sublinhados são uma convenção de raspagem, eles não tornam nada privado (os métodos ainda são acessíveis de fora).
gented

Respostas:

16

A Proposta de Aprimoramento do Python (PEP) 8 explica o significado pretendido por trás dos nomes de sublinhado único e duplo, entre outras convenções. Como muitos dos primeiros PEPs, ele representa as preferências de Guido van Rossum e, como o Ditador Benevolente para a Vida de Python reconheceu, suas preferências são geralmente seguidas pela comunidade de Python.

O uso de sublinhados duplos para indicar as palavras "mágicas" vai, pelo menos, tanto para trás como o pré-processador de C, que usado que convenção começando na década de 1970 ( por exemplo , __FILE__, __LINE__). Isso foi feito porque não havia símbolos fora dos limites do pré-processador; portanto, um padrão de nomeação raramente usado (vários sublinhados e maiúsculas) praticamente garantiu a falta de conflitos.

Ross Patterson
fonte