Mit der Message-Klasse werden Nachrichten für eine effiziente Übertragung über Netzwerk- oder Prozessort hinweg definiert. Nachrichten werden über Feldklassen definiert.
Message
wird vom Modul protorpc.messages
bereitgestellt.
Einführung
Nachrichten unterliegen größeren Einschränkungen als normale Klassen, da sie nur Feldattribute und andere Message- und Enum-Definitionen enthalten dürfen. Diese Einschränkungen sind vorhanden, da die Struktur der Message-Klasse selbst über den Netzwerk- oder Prozessort übertragen und direkt von Clients oder sogar anderen Servern verwendet werden soll. Methoden und Attribute, die nicht zu Feldern gehören, können grundsätzlich nicht mit Strukturinformationen übertragen werden, was zu Diskrepanzen zwischen verschiedenen Sprachen und Implementierungen führt.
Initialisierung und Validierung
Ein Message-Objekt gilt als initialisiert, wenn es alle Pflichtfelder aufweist und alle etwaigen verschachtelten Nachrichten ebenfalls initialisiert sind.
Der Aufruf von 'check_initialized' löst einen ValidationError aus, wenn er nicht initialisiert wird; 'is_initialized' gibt einen booleschen Wert zurück, der die Gültigkeit anzeigt.
Google Protocol RPC überprüft Nachrichtenobjekte beim Erstellen und Ausfüllen automatisch. Ihre Anwendung kann überprüfen, ob ein bestimmter Wert mit einem Feld kompatibel ist, dem er mithilfe der Methode validate() der Field-Instanz zugewiesen wurde. Wenn diese Methode bei einer Nachricht verwendet wird, überprüft sie, ob alle Werte der Nachricht und ihrer Unternachrichten gültig sind. Wird einem Feld ein ungültiger Wert zugewiesen, löst dies einen ValidationError aus.
Das folgende Beispiel erstellt und initialisiert Message-Objekte in einer fiktiven Wertpapierbörsenanwendung.
from protorpc import messages # Trade type. class TradeType(messages.Enum): BUY = 1 SELL = 2 SHORT = 3 CALL = 4 class Lot(messages.Message): price = messages.IntegerField(1, required=True) quantity = messages.IntegerField(2, required=True) class Order(messages.Message): symbol = messages.StringField(1, required=True) total_quantity = messages.IntegerField(2, required=True) trade_type = messages.EnumField(TradeType, 3, required=True) lots = messages.MessageField(Lot, 4, repeated=True) limit = messages.IntegerField(5) order = Order(symbol='GOOG', total_quantity=10, trade_type=TradeType.BUY) lot1 = Lot(price=304, quantity=7) lot2 = Lot(price=305, quantity=3) order.lots = [lot1, lot2] # Now object is initialized! order.check_initialized()
Konstruktor
Der Konstruktor der Message-Klasse wird folgendermaßen definiert:
- Klasse Message(**kwargs)
-
Status interner Nachrichten initialisieren.
Eine Anwendung initialisiert über den Konstruktor eine Nachricht. Dazu werden Schlüsselwortargumente übergeben, die Feldklassen entsprechen. Beispiel:
class Date(Message) day = IntegerField(1) month = IntegerField(2) year = IntegerField(3)
Nachdem Sie das Klassenfeld definiert haben, können Sie Feldwerte präzise aufrufen. Die folgenden beiden Aufrufe sind gleichwertig:
date = Date(day=6, month=6, year=1911)
Entspricht:
date = Date() date.day = 6 date.month = 6 date.year = 1911
Klassenmethoden
Die Message-Klasse bietet folgende Klassenmethoden:
- all_fields()
- Ruft alle Felddefinitionsobjekte ab. Gibt einen Iterator für alle Werte in willkürlicher Reihenfolge zurück.
- field_by_name(name)
- Ruft Felder anhand ihres Namens ab. Gibt ein Field-Objekt zurück, das mit dem Namen verknüpft ist.
- Löst einen KeyError aus, wenn kein Feld mit diesem Namen gefunden wird.
- field_by_number(number)
- Ruft ein Feld anhand der Nummer ab. Gibt das mit der betreffenden Nummer verknüpfte Feldobjekt zurück.
- Löst einen KeyError aus, wenn kein Feld mit dieser Nummer gefunden wird.
Instanzmethoden
Message-Instanzen haben die folgenden Methoden:
- check_initialized()
- Überprüft, ob alle Pflichtfelder initialisiert sind.
- Löst einen ValidationError aus, wenn das Message-Objekt nicht initialisiert wird.
- get_assigned_value(name)
- Ruft den zugewiesenen Namen eines Attributs ab. Wenn der Wert nicht festgelegt ist, wird "None" zurückgegeben.
- Argumente:
- name
- Name des abzurufenden Attributs.
Gibt den zugewiesenen Wert eines Attributs zurück. Wenn dem Attribut kein Wert zugewiesen ist, wird "None" zurückgegeben.
- is_initialized(name)
- Ruft den Initialisierungsstatus für das Message-Objekt ab. Gibt
True
zurück, wenn die Nachricht gültig ist. Andernfalls wirdFalse
zurückgegeben. - reset(name)
- Setzt den zugewiesenen Wert für ein Feld zurück, das den Standardwert wiederherstellt. Wenn es keinen Standardwert gibt, wird "None" zurückgegeben.
- Argumente:
- name
- Name des Felds, das zurückgesetzt werden soll.