Geben Sicherheit in Python
Habe ich definiert Vector
Klasse, die Eigenschaft hat drei Variablen: x
, y
und z
. Koordinaten zu den realen zahlen, aber es gibt nichts zu stoppen zu tun, die folgenden:
>>> v = Vector(8, 7.3, -1)
>>> v.x = "foo"
>>> v.x
"foo"
Konnte ich umsetzen "Art Sicherheit" wie folgt:
import numbers
class Vector:
def __init__(self, x, y, z):
self.setposition(x, y, z)
def setposition(self, x, y, z):
for i in (x, y, z):
if not isinstance(i, numbers.Real):
raise TypeError("Real coordinates only")
self.__x = x
self.__y = y
self.__z = z
@property
def x(self):
return self.__x
@property
def y(self):
return self.__y
@property
def z(self):
return self.__z
...aber das scheint un-Pythonic.
Vorschläge?
- Aber warum? Ganzzahlen arbeitet Total.
- Ich verstehe diese Art von Anliegen kommen in der Regel mit großen Projekten/Teams. Wenn typesafety ist etwas, was Sie fühlen sich stark über, dann schlage ich vor, Sie haben einen Blick auf scala statt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie sich Fragen, warum Sie testen wollen, geben Sie zum festlegen dieser Werte. Heben Sie einfach eine
TypeError
in keiner Berechnung vor, die stolpern über die falscheWert- Typ. Bonus: standard-Operationen dies bereits tun.Duck Typing ist der übliche Weg in Python. Sollte es mit etwas, dass verhält wie eine Zahl, aber nicht unbedingt ist eine reelle Zahl.
In den meisten Fällen in Python sollte man sich nicht explizit zu überprüfen, für Typen. Sie gewinnen Flexibilität, da der code kann verwendet werden, mit benutzerdefinierten Datentypen, solange Sie sich korrekt Verhalten.
Den anderen Antworten schon darauf hingewiesen, dass es nicht viel Sinn zu überprüfen, geben Sie hier. Darüber hinaus können Sie Ihre Klasse nicht sehr schnell, wenn es geschrieben ist in reinem Python.
Wenn Sie möchten, eine mehr pythonic Lösung - man kann Sie nutzen Eigenschaften-setter wie:
Die assert-Anweisung entfernt werden, wenn Sie disable debugging aktivieren oder zu optimieren-Modus.
Alternativ könnte man die Kraft
value
an-floating-point-in den setter. Das wirft eine exception, wenn der Typ/Wert ist nicht konvertierbar:Ich glaube, Sie versuchen zu stoppen jemand aus etwas zu tun, wie, das ist un-Pythonic. Wenn Sie müssen, dann sollten Sie prüfen, für Typ Sicherheit während alle Operationen, die Sie tun könnten, mit
Vector
, meiner Meinung nach.Zitat bei G. V. R:
nachdem alle. Sehen Sie diese Frage und seine Antworten für weitere Informationen.
Ich bin sicher, dass mehr erfahrene Pythonistas, hier kann Ihnen besser Antworten.
Sind Sie nicht soll Art Sicherheit diese Art und Weise. Ja, kann mir jemand absichtlich zu brechen, Ihren code, indem Sie die Bereitstellung von Werten, für die Ihre container nicht funktionieren - aber das ist nur das gleiche mit anderen Sprachen. Und selbst wenn jemand den richtigen Wert für einen parameter in einer Methode oder member-Funktion nicht unbedingt, dass es ist nicht gebrochen: Wenn ein Programm erwartet, dass eine IP-Adresse, aber Sie passieren ein hostname, der es immer noch nicht funktionieren, obwohl beide strings sein.
Was ich sage, ist: Die Mentalität der Python ist von Natur aus anders. Duck typing im Grunde sagt: Hey, ich bin nicht beschränkt auf bestimmte Arten, sondern auf das interface, oder das Verhalten von Objekten. Wenn ein Objekt handeln, wie es die Art der Sache würde ich erwarten, dass ich nicht interessiert - nur für ihn gehen.
Wenn Sie versuchen, die Einführung Art überprüfen, Sie sind im Grunde die Begrenzung eines der nützlichsten features von Sprache.
Dass gesagt wird, die Sie wirklich brauchen, um in test-driven development, oder unit-Tests zumindest. Gibt es wirklich keine Entschuldigung nicht, es zu tun mit dynamischen Sprachen - es ist nur die Richtung (Typ -) Fehler werden erkannt, um einen weiteren Schritt in den build-Prozess, Weg von der Kompilierung bis hin zur Ausführung eines test-suite, mehrere Male am Tag. Während dies scheint wie zusätzliche Aufwand, es wird tatsächlich weniger Zeit für debugging und die Behebung von code, wie es ein von Natur aus mehr leistungsfähige Methode zur Erkennung von Fehlern in Ihrem code.
Aber genug davon, ich bin schon Wandern.