Sublinhado em Python

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:

  1. _+_ 
  2.  _|_ 

Qual dessas duas expressões provavelmente levará a erros e por quê?

Notas de Expressão
Deve-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:

  1. Não há erro na avaliação de cada expressão
     >>> _ = 10 >>> _+_ 20 >>> _ = 10 >>> _|_ 10 
  2. 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' 
  3. 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} 
  4. 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:
__add____ou__
boolbool
bytearrayfrozenset
bytesint
complexodefinir
flutuar
int
lista
str
tupla

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 :

  1. Ao nomear em minúsculas

     lower_case_with_underscores 
  2. Ao nomear em maiúsculas

     UPPER_CASE_WITH_UNDERSCORES 

Alguns nomes limitados a sublinhados são reservados :

  1. Com um sublinhado no início de um nome, ele não é importado durante a importação geral

     from module import * 
  2. Com dois sublinhados nos dois lados do nome é considerado sistêmico, não é recomendável usar esses nomes para outros fins
  3. 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 # Set '_' to None to avoid recursion builtins._ = None text = repr(value) try: sys.stdout.write(text) except UnicodeEncodeError: bytes = text.encode(sys.stdout.encoding, 'backslashreplace') if hasattr(sys.stdout, 'buffer'): sys.stdout.buffer.write(bytes) else: text = bytes.decode(sys.stdout.encoding, 'strict') sys.stdout.write(text) sys.stdout.write("\n") builtins._ = value 

Além disso, um único sublinhado é comumente usado para conveniência da internalização .

Source: https://habr.com/ru/post/pt459672/


All Articles