Warum ist es schlecht, eine Variable idin Python zu benennen ?
ID.
Warum ist es schlecht, eine Variable idin Python zu benennen ?
ID.
Antworten:
id() ist eine grundlegende eingebaute:
Hilfe zur eingebauten Funktion
idim Modul__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.)
Im Allgemeinen ist die Verwendung von Variablennamen, die ein Schlüsselwort oder eine integrierte Funktion in einer beliebigen Sprache in den Schatten stellen, eine schlechte Idee, selbst wenn dies zulässig ist.
idsollte einmal entfernt werden, aber schließlich haben sie beschlossen, ihn nicht zu entfernen. Ich kann meinen ursprünglichen Kommentar nicht mehr bearbeiten, daher werde ich ihn löschen, um künftig keine Verwirrung mehr zu stiften.
str = 'an example word:cat!!'. Gibt es irgendetwas in einem der PEPs, das besagt, dass Sie dies nicht tun sollen?
In PEP 8 - Style Guide für Python-Code wird die folgende Anleitung im Abschnitt Beschreibend angezeigt : Benennen von Styles :
single_trailing_underscore_: Wird von Konventionen verwendet, um Konflikte mit dem Python-Schlüsselwort zu vermeiden, z
Tkinter.Toplevel(master, class_='ClassName')
Um die Frage zu beantworten, ist ein Beispiel, das diese Richtlinie anwendet, Folgendes:
id_ = 42
Das Einfügen des nachfolgenden Unterstrichs in den Variablennamen macht die Absicht klar (für diejenigen, die mit den Anleitungen in PEP 8 vertraut sind).
idist ein eingebautes, kein Schlüsselwort, und dies erklärt nicht, warum es schlecht ist, ein eingebautes zu beschatten.
idist eine integrierte Funktion, die die Identität eines Objekts angibt (die auch seine Speicheradresse in CPython ist). Wenn Sie eine Ihrer Funktionen benennen id, müssen Sie sagen builtins.id, um das Original (oder __builtins__.idin CPython) zu erhalten. Globales Umbenennen idist alles andere als ein kleines Skript verwirrend.
Die Wiederverwendung integrierter Namen als Variablen ist jedoch nicht so schlimm, solange die Verwendung lokal ist. Python hat viele eingebaute Funktionen, die (1) gebräuchliche Namen haben und (2) Sie sowieso nicht viel verwenden werden. Die Verwendung dieser Variablen als lokale Variablen oder als Mitglieder eines Objekts ist in Ordnung, da aus dem Kontext ersichtlich ist, was Sie tun:
Beispiel:
def numbered(filename):
with open(filename) as file:
for i, input in enumerate(file):
print("%s:\t%s" % (i, input), end='')
Einige Einbauten mit verlockenden Namen:
idfilelist, dictmapall, anycomplex, intdirinputslicebuffersummin, maxobject_an den Variablennamen angehängt wird. Bitte sehen Sie meine Antwort .
idFunktion, die die Speicheradresse eines Objekts zurückgibt, ein CPython-Implementierungsdetail ist. Es ist auch erwähnenswert, dass die Funktion nur für zwei vorhandene Objekte eine andere Nummer zurückgeben muss . Wenn ein Objekt durch Müll gesammelt wird, kann seine ID recycelt werden.
Ich könnte hier etwas Unbeliebtes sagen: id()ist eine ziemlich spezialisierte integrierte Funktion, die in der Geschäftslogik selten verwendet wird. Daher sehe ich kein Problem darin, es als Variablennamen in einer engen und gut geschriebenen Funktion zu verwenden, in der klar ist, dass id nicht die integrierte Funktion bedeutet.
import this
ideingebaute sowieso. Das heißt, es hat eine Weile gedauert, bis ein Kollege das listeingebaute mit einer lokalen Variablen überschrieben hat. Die allgemeine Regel, die andere Leute erwähnen, ist also immer noch sinnvoll.
idist eine in Python integrierte Funktion. Durch Zuweisen eines Werts zu idwird die Funktion überschrieben. Es ist am besten, entweder ein Präfix wie in hinzuzufügen some_idoder es in einer anderen Groß- und Kleinschreibung wie in zu verwenden ID.
Die integrierte Funktion verwendet ein einzelnes Argument und gibt eine Ganzzahl für die Speicheradresse des übergebenen Objekts zurück (in CPython).
>>> id(1)
9787760
>>> x = 1
>>> id(x)
9787760
Andere haben erwähnt, dass es verwirrend ist, aber ich möchte näher darauf eingehen, warum . Hier ist ein Beispiel, das auf einer wahren Begebenheit basiert. Grundsätzlich schreibe ich eine Klasse, die einen idParameter akzeptiert, aber später versuche, den eingebauten zu verwenden id.
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)
Erwartete Ausgabe:
Created Employee 'Taylor Swift' at 0x7efde30ae910
Tatsächliche Ausgabe:
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
Huh? Wo versuche ich einen Int aufzurufen? Das sind alles eingebaute ...
Wenn ich es benannt hätte badge_idoder id_, hätte ich dieses Problem nicht gehabt.
Da Python eine dynamische Sprache ist, ist es normalerweise keine gute Idee, einer Variablen und einer Funktion den gleichen Namen zu geben. id () ist eine Funktion in Python, daher wird empfohlen, keine Variable mit dem Namen id zu verwenden. Vor diesem Hintergrund gilt dies für alle Funktionen, die Sie möglicherweise verwenden. Eine Variable sollte nicht denselben Namen wie eine Funktion haben.