Por que é ruim nomear uma variável id
no Python?
ID
.
Por que é ruim nomear uma variável id
no Python?
ID
.
Respostas:
id()
é um elemento fundamental fundamental:
Ajuda na função embutida
id
no módulo__builtin__
:id(...) id(object) -> integer Return the identity of an object. This is guaranteed to be unique among simultaneously existing objects. (Hint: it's the object's memory address.)
Em geral, o uso de nomes de variáveis que eclipsam uma palavra-chave ou função interna em qualquer idioma é uma má idéia, mesmo que seja permitida.
id
foi programada para remoção de uma só vez, mas eventualmente eles decidiram não removê-la. Não consigo mais editar meu comentário original, por isso o excluo para evitar confundir as pessoas no futuro.
str = 'an example word:cat!!'
. Existe algo em algum dos PEPs que diz não fazer isso?
No PEP 8 - Guia de Estilo para Código Python , a seguinte orientação aparece na seção Descritiva: Estilos de Nomenclatura :
single_trailing_underscore_
: usado por convenção para evitar conflitos com a palavra-chave Python, por exemplo
Tkinter.Toplevel(master, class_='ClassName')
Portanto, para responder à pergunta, um exemplo que aplica essa diretriz é:
id_ = 42
A inclusão do sublinhado à direita no nome da variável torna clara a intenção (para aqueles familiarizados com as orientações do PEP 8).
id
é um componente interno, não uma palavra-chave, e isso não explica por que é ruim ocultar um componente interno.
id
é uma função interna que fornece a identidade de um objeto (que também é seu endereço de memória no CPython). Se você nomear uma de suas funções id
, terá que dizer builtins.id
para obter a original (ou __builtins__.id
no CPython). Renomear id
globalmente é confuso em qualquer coisa, menos em um pequeno script.
No entanto, reutilizar nomes internos como variáveis não é tão ruim, desde que o uso seja local. O Python possui muitas funções internas que (1) têm nomes comuns e (2) você não utilizará muito de qualquer maneira. Usar estas como variáveis locais ou como membros de um objeto é bom porque é óbvio, por contexto, o que você está fazendo:
Exemplo:
def numbered(filename):
with open(filename) as file:
for i, input in enumerate(file):
print("%s:\t%s" % (i, input), end='')
Alguns built-ins com nomes tentadores:
id
file
list
, dict
map
all
, any
complex
, int
dir
input
slice
buffer
sum
min
, max
object
_
ao nome da variável. Por favor, veja minha resposta .
id
função que retorna o endereço de memória de um objeto é um detalhe de implementação do CPython. Também é importante notar que a função é necessária apenas para retornar um número diferente para quaisquer dois objetos existentes . Se um objeto for coletado de lixo, seu ID poderá ser reciclado.
Eu poderia dizer algo impopular aqui: id()
é uma função interna bastante especializada que raramente é usada na lógica de negócios. Portanto, não vejo problema em usá-lo como um nome de variável em uma função rígida e bem escrita, onde fica claro que id não significa a função interna.
import this
id
builtin de qualquer maneira. Dito isto, demorei um tempo quando um colega substituiu o list
interno por uma variável local. Portanto, a regra geral que outras pessoas mencionam ainda faz sentido.
id
é uma função interna do Python. A atribuição de um valor id
substituirá a função. É melhor adicionar um prefixo como em some_id
ou usá-lo em uma capitalização diferente como em ID
.
A função interna usa um único argumento e retorna um número inteiro para o endereço de memória do objeto que você passou (no CPython).
>>> id(1)
9787760
>>> x = 1
>>> id(x)
9787760
Outros mencionaram que é confuso, mas quero expandir o porquê . Aqui está um exemplo, com base em uma história verdadeira. Basicamente, escrevo uma classe que aceita um id
parâmetro, mas depois tento usar o incorporado id
mais tarde.
class Employee:
def __init__(self, name, id):
"""Create employee, with their name and badge id."""
self.name = name
self.id = id
# ... lots more code, making you forget about the parameter names
print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
tay = Employee('Taylor Swift', 1985)
Saída esperada:
Created Employee 'Taylor Swift' at 0x7efde30ae910
Saída real:
Traceback (most recent call last):
File "company.py", line 9, in <module>
tay = Employee('Taylor Swift', 1985)
File "company.py", line 7, in __init__
print('Created', type(self).__name__, repr(name), 'at', hex(id(self)))
TypeError: 'int' object is not callable
Hã? Onde estou tentando chamar um int? Esses são todos os ...
Se eu o nomeasse badge_id
ou id_
não teria esse problema.
Como python é uma linguagem dinâmica, geralmente não é uma boa idéia atribuir o mesmo nome a uma variável e uma função. id () é uma função em python, por isso é recomendável não usar uma variável chamada id. Tendo isso em mente, isso se aplica a todas as funções que você pode usar ... uma variável não deve ter o mesmo nome que uma função.