O True e "..." são tokens especiais no parser.
Jã, `Ellipsis` é só um nome registrado nos `bultins` .
Não me lembro quando True e False passaram a ser tokens especiais
-acho que foi no Python 3.0
(pq criar novas palavras chave "hard" sempre quebra compatibilidade,
já que voce invalida código que use aquelas palavras como nomes de
variáveis) .
E True e False não sendo nomes válidos pra variáveis evitas um monte de "WTF"s
```
True, False = False, True # válido em Python 2
```
Já, ... nunca foi um nome válido mesmo - o "." (é apenas um operador
do ponto de vista da linguagem: um operador que chama `__getattr__`,
`__setattr__` , `__del__` , dependendo do contexto) usado mais de uma
vez consecutiva seria um erro de sintaxe, então já é um token a mais
tempo: é traduzido direto na AST.
(é interessante notar que tanto True, False, ... e None, depois que o
programa está rodando, sao objetos quase como qualquer outro pra
linguagem. Se são usados dentro de uma função, tem que estar na tabela
de constantes do objeto de code daquela função. Eles diferem pq (1)
são "singletons": o método __new__ da classe deles sempre vai
devolver as mesmas instâncias e (2) em Pythons mais recentes são
"imortais" e dispensam a contagem de referências)
Outra coisa legal que sua pergunta toca indiretamente são os "bultins"
- (é onde o nome Ellipsis fica definido): o terceiro escopo visível de
variáveis, além de "locals" e "globals". O nome `__builtins__` é um
módulo especial, e qualquer variável definida no mesmo está sempre
disponível, onde quer que uma busca por um nome no escopo "global"
aconteça: é uma formade ter uma "variável global igual em C" em
Python: disponível em todos os módulos do seu programa sem precisar
ser importada.
Só fazer `__builtins__.faz_caca = lambda (): print("ih, fiz caca")`
Se você faz a atribuição a Ellipsis como você fez, ela fica no
dicionário de globais do módulo atual (no caso do interpretador
interativo, é o "__main__"). Outros módulos que forem usar o nome
Ellipsis vão puxar o nome do __builtins__ e funcionar corretamente.
Mas se você fizer a atribuição direto no bultins, vai capotar o
interpretador: ali na frente algum código vai achar que está pegando
"Ellipsis" e vai ser outro objeto. (O mesmo vale pra qualquer
sobreposição no __bultins__: "print", "input", "open", "__import__":
são todos nomes definidos lá. Se trocar o `__builtins__.__import__`
afeta o próprio comando `import`, aliás)
js
-><-
> --
> --
> ------------------------------------
> Grupo Python-Brasil
>
https://wiki.python.org.br/AntesDePerguntar
>
> <*> Para visitar o site do grupo na web, acesse:
>
http://groups.google.com/group/python-brasil
>
> <*> Para sair deste grupo, envie um e-mail para:
>
python-brasi...@googlegroups.com
> ---
> Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para
python-brasi...@googlegroups.com.
> Para ver esta conversa, acesse
https://groups.google.com/d/msgid/python-brasil/b523ed46-4d28-451d-96e2-23c43bb7b1d9n%40googlegroups.com.