Pourquoi est-il mauvais de nommer une variable iden Python?
ID.
Pourquoi est-il mauvais de nommer une variable iden Python?
ID.
Réponses:
id() est un élément fondamental:
Aide sur la fonction intégrée
iddans le module__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.)
En général, utiliser des noms de variables qui éclipsent un mot-clé ou une fonction intégrée dans n'importe quelle langue est une mauvaise idée, même si cela est autorisé.
iddevait être supprimée à un moment donné, mais ils ont finalement décidé de ne pas la supprimer. Je ne peux plus modifier mon commentaire d'origine, je le supprimerai donc pour éviter de semer la confusion dans le futur.
str = 'an example word:cat!!'. Y a-t-il quelque chose dans l'un des PEP qui dit de ne pas faire cela?
Dans PEP 8 - Guide de style pour le code Python , les conseils suivants apparaissent dans la section Descriptif: Styles de dénomination :
single_trailing_underscore_: utilisé par convention pour éviter les conflits avec le mot clé Python, par exemple
Tkinter.Toplevel(master, class_='ClassName')
Donc, pour répondre à la question, un exemple qui applique cette directive est:
id_ = 42
L'inclusion du trait de soulignement de fin dans le nom de la variable rend l'intention claire (pour ceux qui sont familiers avec les conseils de PEP 8).
idc'est un builtin, pas un mot-clé, et cela n'explique pas pourquoi il est mauvais d'observer un builtin.
idest une fonction intégrée qui donne l'identité d'un objet (qui est également son adresse mémoire en CPython). Si vous nommez l'une de vos fonctions id, vous devrez dire builtins.idpour récupérer l'original (ou __builtins__.iden CPython). Renommer idglobalement est déroutant dans tout sauf un petit script.
Cependant, la réutilisation des noms intégrés en tant que variables n'est pas si mal tant que l'utilisation est locale. Python a beaucoup de fonctions intégrées qui (1) ont des noms communs et (2) vous n'utiliserez pas grand-chose de toute façon. Les utiliser en tant que variables locales ou en tant que membres d'un objet est acceptable car ce que vous faites est évident d'après le contexte:
Exemple:
def numbered(filename):
with open(filename) as file:
for i, input in enumerate(file):
print("%s:\t%s" % (i, input), end='')
Quelques éléments intégrés aux noms tentants:
idfilelist, dictmapall, anycomplex, intdirinputslicebuffersummin, maxobject_au nom de la variable. S'il vous plaît voir ma réponse .
idfonction renvoyant l'adresse mémoire d'un objet est un détail d'implémentation CPython. Il convient également de noter que la fonction n'est requise que pour renvoyer un nombre différent pour deux objets existants . Si un objet est ramassé, son identifiant peut être recyclé.
Je pourrais dire quelque chose d'impopulaire ici: id()c'est une fonction intégrée plutôt spécialisée qui est rarement utilisée dans la logique métier. Par conséquent, je ne vois pas de problème à l'utiliser comme nom de variable dans une fonction serrée et bien écrite, où il est clair que id ne signifie pas la fonction intégrée.
import this
idtoute façon, très peu de gens utilisent le builtin. Cela dit, il m'a fallu un certain temps lorsqu'un collègue a listécrasé la variable intégrée avec une variable locale. La règle générale que d'autres personnes mentionnent est donc toujours logique.
idest une fonction intégrée en Python. Attribuer une valeur à idremplacera la fonction. Il est préférable d'ajouter un préfixe comme dans some_idou de l'utiliser dans une capitalisation différente comme dans ID.
La fonction intégrée prend un seul argument et renvoie un entier pour l'adresse mémoire de l'objet que vous avez passé (en CPython).
>>> id(1)
9787760
>>> x = 1
>>> id(x)
9787760
D'autres ont mentionné que c'était déroutant, mais je veux expliquer pourquoi . Voici un exemple, basé sur une histoire vraie. Fondamentalement, j'écris une classe qui prend un idparamètre, mais j'essaie ensuite d'utiliser la fonction intégrée idplus tard.
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)
Production attendue:
Created Employee 'Taylor Swift' at 0x7efde30ae910
Sortie réelle:
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
Hein? Où est-ce que j'essaye d'appeler un int? Ce sont tous des éléments intégrés ...
Si je l'ai nommé badge_idou id_, je n'aurais pas eu ce problème.
Parce que python est un langage dynamique, ce n'est généralement pas une bonne idée de donner le même nom à une variable et à une fonction. id () est une fonction en python, il est donc recommandé de ne pas utiliser une variable nommée id. Gardant cela à l'esprit, cela s'applique à toutes les fonctions que vous pourriez utiliser ... une variable ne devrait pas avoir le même nom qu'une fonction.