Variada utilização de sublinhados em Convenções de Nomes explicados!!

Rachit Tayal

Follow

Ago 6, 2019 – 5 min ler

O sublinhado _ é especial em Python. Enquanto o underscore é usado apenas para variáveis e funções do caso da cobra em muitas linguagens, mas tem significados especiais em Python. Eles são usados extensivamente em vários cenários incluindo casos onde gostaríamos de ignorar algum valor, ou na declaração de variáveis, métodos, etc.

Single e double underscores têm um significado em Python variável e nomes de métodos. Parte do significado é meramente por convenção, enquanto parte dele é imposto pelo intérprete Python.

Neste artigo vamos discutir os cinco padrões de underscore e convenções de nomes e como eles afetam o comportamento dos nossos programas Python. A compreensão destes conceitos ajudará muito especialmente quando escrevermos código avançado.

No final deste post, teremos um entendimento justo de como e onde usar qual padrão de underscore na nossa convenção de nomenclatura. Então vamos começar.

Single Leading Underscore: _var

O prefixo sublinhado é uma dica para outro programador de que uma variável ou método que começa com um único sublinhado é destinado a uso interno. Esta convenção é definida no PEP 8.

Um nome prefixado com um sublinhado (por exemplo _spam) deve ser tratado como uma parte não pública da API (quer seja uma função, um método ou um membro de dados). Deve ser considerado um detalhe de implementação e sujeito a alterações sem aviso prévio.

Dê uma olhada no seguinte exemplo:

class Person:
def __init__(self):
self.name = 'Sarah'
self._age = 26

Seja instanciada a classe acima e tente acessar os atributos name e _age.

>>> p = Person()>>> p.name
Sarah>>> p._age
26

Então, o prefixo single underscore em Python é meramente uma convenção e não impõe qualquer restrição ao acesso ao valor dessa variável.

Double Leading Underscore: __var

O uso de double underscore (__) na frente de um nome (especificamente um nome de método) não é uma convenção; tem um significado específico para o intérprete.

Python modifica estes nomes e é usado para evitar conflitos de nomes com nomes definidos por subclasses.

Também é chamado de mangling name – o intérprete muda o nome da variável de uma forma que dificulta a criação de colisões quando a classe é estendida posteriormente.

Para entender melhor, vamos criar nossa classe de brinquedos para experimentação:

class Person:
def __init__(self):
self.name = 'Sarah'
self._age = 26
self.__id = 30

Vamos dar uma olhada nos atributos de seu objeto usando o built-in dir() function:

>>> p = Person()
>>> dir(p)
>>> p.name
Sarah
>>> p._age
26>>> p.__id
AttributeError: 'Person' object has no attribute '__id'>>> p._Person__id
30

Da lista acima de atributos do objeto, podemos ver que self.name e self._age aparece inalterado e se comporta da mesma forma.

No entanto, __id é mangueirado para _Person__id. Este é o nome mangling que o intérprete Python aplica. Ele faz isto para proteger a variável de ser substituída em subclasses.

Agora se criarmos uma subclasse de Person, digamos Employee não podemos facilmente substituir Person por __id variável.

O comportamento pretendido aqui é quase equivalente a variáveis finais em Java e não virtuais em C++.

Single Trailing Underscore: var_

Como explicado em PEP 8 docs:

>

Convenção de nomes de trailing underscore único é usado para evitar conflitos com palavras-chave Python.

Quando o nome mais adequado para uma variável já é tomado por uma palavra-chave, anexando uma única convenção de underscore é seguido para quebrar o conflito de nomes. Exemplo típico inclui o uso de class ou outras palavras-chave como variáveis.

>>> def method(name, class='Classname'): # ❌
SyntaxError: "invalid syntax">>> def method(name, class_='Classname'): # ✅
... pass

Douplo Leading and Trailing Underscore: __var__

Nomes que têm sublinhados duplo à esquerda e à direita (“dunders”) são reservados para uso especial como o método__init__ para construtores de objetos, ou o método __call__ para tornar o objeto chamável. Estes métodos são conhecidos como dunder methods.

No que diz respeito a alguém, esta é apenas uma convenção, uma forma do sistema Python usar nomes que não entrem em conflito com nomes definidos pelo usuário. Portanto, os dunders são apenas uma convenção e são deixados intocados pelo interpretador Python.

class Person:
def __init__(self):
self.__name__ = 'Sarah'>>> Person().__name__
Sarah

Os dunders atingem o objetivo desejado de tornar certos métodos especiais e ao mesmo tempo torná-los iguais a outros métodos simples em todos os aspectos, exceto convenção de nomes.

Para ser honesto, nada nos impede de escrever nosso próprio dunder name, mas é melhor ficar longe de usá-los em nossos programas para evitar colisões com futuras mudanças na linguagem Python. (Consulte a minha história que detalha os dunders de forma abrangente).

Single Underscore: _

Por convenção, um único sublinhado independente é às vezes usado como nome para indicar que uma variável é temporária ou insignificante.

Por exemplo, no laço seguinte não precisamos de acesso ao índice em execução e podemos usar “_” para indicar que é apenas um valor temporário:

>>> for _ in range(10):
... print('Welcome Sarah!!')

Again, este significado é apenas “por convenção” e não há nenhum comportamento especial desencadeado no interpretador Python. O único sublinhado é simplesmente um nome de variável válido que às vezes é usado para este propósito.

Conclusions:

Conhecendo os vários sublinhados padrão ajudará a escrever o nosso código mais Pythonic. 😄

Aqui está um resumo rápido dos nossos 5 padrões de sublinhados para as convenções de nomenclatura, que cobrimos acima.

  • Single Leading Underscore _var: A convenção de nomenclatura indicando o nome é para uso interno. Uma dica para programadores e não imposta por programadores.
  • Duplo Leading Underscore __var: Dispara o nome mangling quando usado em contexto de classe. Reforçado pelo intérprete Python.
  • Single Trailing Underscore var_: Usado por convenção para evitar conflitos de nomes com palavras-chave Python.
  • Double Trailing Underscore __var__: Indica métodos especiais definidos pela linguagem Python.
  • Underscore _: Usado como nome para variáveis temporárias.

Deixe uma resposta

O seu endereço de email não será publicado.