Kraft ist eine Funktion der parameter Typ in Python?
Habe ich eine Funktion in eine Python-Klasse, die fügt über Schnittstellen zu einer Liste.
def RegisterAsListener(self, inListener):
self.__TransitListeners.append(inListener)
Das ist schön, denn eine Klasse muss nur Erben, sagte mein Interface, greifen Sie das Objekt, und registrieren Sie sich für alle updates.
class ITransit():
def TransitUpdate(self, data):
raise NotImplementedError("You must define this function.")
(vorausgesetzt, ich machte eine Schnittstelle korrekt)
Da bin ich nicht der einzige auf diesem Projekt, die ich nicht wollen, dass jemand den Aufruf der RegisterAsListener Funktion mit einem falschen Datentyp. Ich konnte im code zu überprüfen, den Typ innerhalb der Funktion register, aber es wäre einfacher, wenn der compiler nur geschrien an die Programmierer, wenn Sie versuchen, zu schieben, in einen falschen Datentyp.
def RegisterAsListener(self, IListener inListener):
self.__TransitListeners.append(inListener)
Gibt es eine Möglichkeit, dies zu tun?
if the compiler just yelled at the programmer
... welchen compiler?- Verwenden Sie die
abc
Modul zu definieren, was ein Objekt implementieren sollten, statt. - Ansonsten, Python ist eine dynamisch typisierte Sprache ist, ist es nicht erzwingen-Objekt-Typen für Sie.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl ich würde nicht empfehlen, dies zu tun und nur die Durchsetzung der Umsetzung von bestimmten Methoden wie die Verwendung von Abstrakten Basisklassen (http://docs.python.org/2/library/abc.html), es ist möglich.
Hier ist ein Beispiel, wie man so etwas machen: http://www.artima.com/weblogs/viewpost.jsp?thread=101605
Und den code verwendest:
Beispiel-Ausgabe:
Dokument die Funktion gründlich, dann lassen Sie falsche Parameter exceptions werfen. Die Benutzer des
RegisterAListener
sollte in der Lage sein, die Dokumentation zu verwenden, zu wissen, welche Art von Daten die Funktion erwartet, und - wenn gegeben, falsche Parameter - die daraus resultierende Ausnahme soll deutlich machen, was der Benutzer vonRegisterAListener
falsch gemacht haben.