2014-02-05 8 views
5

Ich frage mich, ist es empfohlen/Pythonic benutzerdefinierte benutzerdefinierte Unterstreichungsvariablen/Funktionen in einem Python-Skript zu definieren und zu verwenden? Zum Beispiel __tablename__ wie in SQLAlchemy oder __validateitem__() (eine benutzerdefinierte Funktion, die ein Element vor der Anwendung __setitem__() zu ihm verwendet) verwendet.Wie wird empfohlen, benutzerdefinierte doppelte Unterstrichvariablen in Python zu verwenden?

Wenn es definiert, dass etwas Magie passiert, oder dass diese spezifische Variable/Funktion in der Tat in einer besonderen Weise (wie die beiden obigen Beispiele) verwendet wird, halte ich es für eine gute Idee, sie zu verwenden.

Ich interessiere mich für Argumente sowohl für die besten Programmierpraktiken als auch für mögliche Risiken bei der Verwendung dieser Art von Benennung.

Antwort

4

Von PEP8:

__double_leading_and_trailing_underscore__: "Magie" Objekte oder Attribute, die in benutzergesteuerten Namensräumen leben. Z.B. __init__, __import__ oder __file__. Erfinde niemals solche Namen; verwende sie nur wie dokumentiert.

So lautet der Ratschlag, nicht die doppelte Unterstrichsyntax für Ihre eigenen Variablen zu verwenden.

+0

Ist es, weil es Benutzer irreführen kann zu denken, dass es ein standarddefinierter Name ist? Oder ist es zukunftssicher, weil jederzeit eine Variable mit diesem Namen in der Standardbibliothek implementiert werden kann? Es gibt Fälle, in denen _exactly_ das mit diesen Namen beabsichtigt und betont wird, dass etwas "Magie" auftritt. – linkyndy

+1

Benutzerdefiniert __ ist ein privater Marker. Da Python interpretiert wird, gibt es nicht wirklich private var/method. Verwende nur einen Unterstrich, um deine Vars als "sei vorsichtig" zu markieren. Der Zugriff auf __vars ist langsamer als normal, also hast du keinen Grund, dies zu benutzen. – cox

+0

Was unterstützt die Interpretation, dass ein Programmierer solch einen Namen nicht erfinden sollte? Mein Problem ist, Programmierer schreiben hier Apis für Programmierer. Welcher ist der "eigene" Programmierer? – n611x007