Klasse "Message"

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 wird False 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.