Recentemente, tive a chance de ouvir uma palestra sobre boas e más práticas de programação C. Nele, em particular, o tópico de decodificação de código de programa de
aparência engraçada (
emoticons em C) foi abordado. Houve um debate sobre a conveniência de usar esse código confuso para testar as habilidades de um candidato a uma posição de programador durante as entrevistas. A disputa não levou a um consenso.
Considere uma possível pergunta sobre
emoticons durante uma entrevista para uma posição que implica conhecimento da linguagem de programação Python.

Desafio
Existem duas expressões:
_+_
_|_
Qual dessas duas expressões provavelmente levará a erros e por quê?
Notas de ExpressãoDeve-se notar que essas expressões são mal lidas, não é aconselhável usar essas expressões no código de trabalho, mas só podem ser usadas como quebra-cabeças.
Você também precisa se lembrar de que os
emoticons na tarefa não são gravados
pythonically (não estão de acordo com o padrão de estilo
PEP 8 ).
Solução
No Python, o sublinhado não é uma
palavra -
chave ; portanto, em geral, pode ser usado para atribuir determinados valores a variáveis.
A tarefa é reduzida à consideração de casos de erros durante a adição e com “bit a bit ou” (por uma questão de brevidade, simplesmente “ou”) uma variável. I.e. pesquisar tipos internos do Python (classes) para os quais uma operação é implementada e pesquisar tipos internos nos quais outra operação é implementada.
No console do Python, é fácil verificar se há valores de sublinhado, tais como:
Não há erro na avaliação de cada expressão >>> _ = 10 >>> _+_ 20 >>> _ = 10 >>> _|_ 10
Não há erro ao avaliar a primeira expressão >>> _ = '10' >>> _+_ '1010' >>> _ = '10' >>> _|_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for |: 'str' and 'str'
Não há erro no cálculo da segunda expressão >>> _ = {1, 0} >>> _+_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'set' and 'set' >>> _|_ {0, 1}
Há um erro no cálculo de cada expressão >>> _ = {1: 0} >>> _+_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'dict' and 'dict' >>> _|_ Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for |: 'dict' and 'dict'
A mágica do Python é que a implementação de adições e “ou” e outros operadores está nos chamados
“métodos mágicos” descritos para as classes necessárias.
Além disso, este é o método
__add__
Para "ou", este é um método
__or__
O nome de cada método mágico contém sublinhados, dois no início e no final da palavra correspondente.
Localizando informações sobre as classes internas do Python.Você pode tentar encontrar as informações necessárias na documentação para tipos internos no site oficial do Python:
https://docs.python.org/3.7/library/stdtypes.html .
Você pode executar em um terminal Python
>>> import builtins >>> help(builtins)
Prefiro usar a documentação da versão exata do Python que estou usando atualmente, referindo-se à interface da web do módulo pydoc.
Para fazer isso, no prompt de comando, digite, por exemplo:
python3 -m pydoc -p 3344
e abra o módulo de documentação do navegador
http: // localhost: 3344 / builtins.html .
Classes internas para as quais nossos métodos são implementados:
Nove classes internas implementam a operação de adição e quatro implementam o "ou".
Além disso, você pode tentar especular sobre a frequência do uso de classes base em projetos reais, sobre classes não básicas e a implementação dos métodos acima para elas. É provável que isso seja apreciado positivamente durante a entrevista.
Resposta 1.A segunda expressão geralmente leva a um erro.
Possíveis perguntas adicionais sobre a entrevista sublinhada
Qual é o papel do sublinhado na nomeação de objetos?
Resposta 2.O sublinhado pode ser usado para separar palavras em
diferentes estilos de nomeação de entidades no Python :
- Ao nomear em minúsculas
lower_case_with_underscores
- Ao nomear em maiúsculas
UPPER_CASE_WITH_UNDERSCORES
Alguns nomes limitados a sublinhados são
reservados :
- Com um sublinhado no início de um nome, ele não é importado durante a importação geral
from module import *
- Com dois sublinhados nos dois lados do nome é considerado sistêmico, não é recomendável usar esses nomes para outros fins
- Com dois sublinhados no início de um nome, é considerado privado (não público) para a classe
Qual é o papel de um único sublinhado?
Resposta 3.No intérprete, se o sublinhado não tiver sido explicitamente usado como variável, ele armazenará o resultado da última ação sem erros exibida na tela.
$ python3 Python 3.6.8 (default, Feb 14 2019, 22:09:48) [GCC 7.4.0] on cygwin Type "help", "copyright", "credits" or "license" for more information. >>> _ Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name '_' is not defined >>> 2 * 5 10 >>> _ 10 >>> _ = 1 >>> _ 1 >>> 2 * 5 10 >>> _ 1
Isso ocorre porque o
sys.stdout está escapando com o
displayhook . Veja um exemplo da
documentação oficial :
def displayhook(value): if value is None: return
Além disso, um único sublinhado é comumente usado para conveniência da
internalização .