La plupart des gens ajoutent un trait de soulignement aux identifiants qui entrent en conflit avec les mots-clés intégrés: id_, map_, list_, filter_, etc.
cdleary
3
Une solution plus sournoise serait d'utiliser une variable ID.
Simon Kuang
46
Une meilleure question serait ... Quel génie a pensé que l'utilisation d'un nom générique aussi commun pour une fonction intégrée était une bonne idée?
base
Réponses:
143
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é.
OK, pour 'id' vous avez raison, mais le commentaire "en général ..." s'applique toujours, vous ne pensez pas?
Kevin Little le
5
Je l'éviterais certainement pour les modules globaux. Pour les variables limitées à la portée locale, vous pouvez donc voir que la même fonction n'aura jamais besoin d'utiliser la fonction intégrée, ce n'est pas quelque chose dont je m'inquiéterais.
bobince le
@Caramdir: Bonne prise, 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.
Eli Courtwright
20
@EliCourtwright J'aurais aimé qu'ils l'aient enlevé. Quelle méthode mal nommée! Un nom générique et commun utilisé dans des milliers d'endroits (où le contexte donne un sens). Alors quelqu'un a décidé de l'utiliser comme un nom global où il n'y a pas de contexte?
base
2
Étonnamment, le propre didacticiel Python regex de Google ( développeurs.google.com/ edu/python/regular-expressions ) utilise str = 'an example word:cat!!'. Y a-t-il quelque chose dans l'un des PEP qui dit de ne pas faire cela?
mots pour le
57
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).
Cela ne répond pas à la question réelle, mais +1 pour la convention de dénomination PEP-8
ege
Bon conseil, mais idc'est un builtin, pas un mot-clé, et cela n'explique pas pourquoi il est mauvais d'observer un builtin.
wjandrea le
51
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='')
PEP 8 , qui a été mis à jour le 1er août 2013, conseille désormais d'éviter toute confusion potentielle en ajoutant simplement _au nom de la variable. S'il vous plaît voir ma réponse .
DavidRR
1
Il est à noter que la 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é.
Zac Crites
@Zac Merci! J'ai modifié la réponse pour ajouter ce point sur l'adresse mémoire et un lien pour que les gens puissent en savoir plus.
wjandrea le
42
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.
En réponse à:> id 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. Bien que cela soit vrai, c'est probablement une bonne idée d'être plus précis avec ce nom de variable que simplement "id". Beaucoup de choses ont des identifiants (surtout si vous travaillez avec un SGBDR), et comme le dit la deuxième ligne de The Zen of Python de Tim Peters :> Explicite vaut mieux qu'implicite. Voir le reste en courant:import this
Ross
9
Je l'éviterais quand même si possible. Même si pour aucune autre raison que de ne pas entendre les collègues se plaindre. :-)
Jason Baker
1
Je suis tout à fait d'accord: nommer une variable "id" dans une petite fonction (et donc scope) est inoffensif. De 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.
silviot
5
Il est mauvais de nommer une variable après une fonction intégrée. L'une des raisons est que cela peut être déroutant pour un lecteur qui ne sait pas que le nom est remplacé.
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).
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.
classEmployee: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 namesprint('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 isnot 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.
"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." - Vous ne pouvez pas donner le même nom à une variable et à une fonction. Rien à voir avec le fait qu'il s'agit d'un langage dynamique. Si vous voulez dire donner aux propriétés les mêmes noms que d'autres objets dans la même portée, je suis également en désaccord. Vous pouvez avoir une classe appelée "Key", une instance de cette classe appelée "key" et une propriété d'un autre objet appelé "key", par exemple, "door.key".
ID
.Réponses:
id()
est un élément fondamental: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é.
la source
id
devait ê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 :
Donc, pour répondre à la question, un exemple qui applique cette directive est:
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).
la source
id
c'est un builtin, pas un mot-clé, et cela n'explique pas pourquoi il est mauvais d'observer un builtin.id
est 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 fonctionsid
, vous devrez direbuiltins.id
pour récupérer l'original (ou__builtins__.id
en CPython). Renommerid
globalement 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:
Quelques éléments intégrés aux noms tentants:
id
file
list
,dict
map
all
,any
complex
,int
dir
input
slice
buffer
sum
min
,max
object
la source
_
au nom de la variable. S'il vous plaît voir ma réponse .id
fonction 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.la source
import this
id
toute façon, très peu de gens utilisent le builtin. Cela dit, il m'a fallu un certain temps lorsqu'un collègue alist
é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.Il est mauvais de nommer une variable après une fonction intégrée. L'une des raisons est que cela peut être déroutant pour un lecteur qui ne sait pas que le nom est remplacé.
la source
id
est une fonction intégrée en Python. Attribuer une valeur àid
remplacera la fonction. Il est préférable d'ajouter un préfixe comme danssome_id
ou de l'utiliser dans une capitalisation différente comme dansID
.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).
la source
Parce que c'est le nom d'une fonction intégrée.
la source
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
id
paramètre, mais j'essaie ensuite d'utiliser la fonction intégréeid
plus tard.Production attendue:
Sortie réelle:
Si je l'ai nommé
badge_id
ouid_
, je n'aurais pas eu ce problème.la source
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.
la source