Classe messaggio

La classe Message viene utilizzata per definire i messaggi per una trasmissione efficiente nella rete o nello spazio di processo. I messaggi vengono definiti utilizzando le classi di campo.

Message è fornito dal modulo protorpc.messages.

Introduzione

I messaggi sono più ristretti rispetto alle classi normali, in quanto possono contenere solo attributi di campo e altre definizioni di Message ed Enum. Queste limitazioni sono presenti perché la struttura della classe Message stessa è destinata a essere trasmessa in rete o nello spazio di processo e viene utilizzata direttamente dai client o anche da altri server. Di conseguenza, i metodi e gli attributi non di campo non possono essere trasmessi con informazioni strutturali, il che causa discrepanze tra le diverse lingue e implementazioni.

Inizializzazione e convalida

Un oggetto Message viene considerato inizializzato se dispone di tutti i campi obbligatori e se sono inizializzati anche messaggi nidificati.

La chiamata a "check_initialized" genererà un valore ValidationError se non viene inizializzato. "is_initialized" restituisce un valore booleano che indica se è valido.

Google Protocol RPC convalida automaticamente gli oggetti Message quando vengono creati e compilati. La tua applicazione può verificare se un determinato valore è compatibile con un campo a cui è assegnato utilizzando il metodo validate() dell'istanza di Field. Quando viene utilizzato in un messaggio, questo metodo verifica che tutti i valori di un messaggio e dei relativi messaggi secondari siano validi. L'assegnazione di un valore non valido a un campo genera un errore ValidationError.

L'esempio seguente crea e inizializza gli oggetti Message in un'applicazione fittizia di trading di azioni.

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()

Costruttore

Il costruttore della classe Message viene definito come segue:

class Messaggio(**kwargs)

Inizializzare lo stato dei messaggi interni.

Un'applicazione inizializza un messaggio tramite il costruttore passando gli argomenti delle parole chiave corrispondenti alle classi di campo. Ad esempio:

class Date(Message)
    day = IntegerField(1)
    month = IntegerField(2)
    year = IntegerField(3)

Dopo aver definito il campo della classe, puoi richiamare in modo conciso i valori dei campi. Le due chiamate seguenti sono equivalenti:

date = Date(day=6, month=6, year=1911)

Equivale a:

date = Date()
date.day = 6
date.month = 6
date.year = 1911

Metodi delle classi

La classe Message offre i seguenti metodi:

all_fields()
Recupera tutti gli oggetti di definizione dei campi. Restituisce un iteratore per tutti i valori in ordine arbitrario.
field_by_name(name)
Recupera i campi per nome. Restituisce un oggetto Field associato al nome.
Solleva un KeyError se non viene trovato alcun campo con quel nome.
field_by_number(number)
Recupera un campo in base al numero. Restituisce l'oggetto campo associato al numero.
Solleva un KeyError se non viene trovato alcun campo con quel numero.

Metodi di istanza

Le istanze dei messaggi hanno i seguenti metodi:

check_initialized()
Verifica che tutti i campi obbligatori siano inizializzati.
Genera un valore ValidationError se l'oggetto Message non è inizializzato.
get_assigned_value(name)
Recupera il valore assegnato di un attributo. Se il valore non viene impostato, restituisce None.
Argomenti:
nome
Nome dell'attributo da ottenere.

Restituisce il valore assegnato di un attributo o None se l'attributo non ha alcun valore assegnato.

is_initialized(name)
Ottieni lo stato di inizializzazione per l'oggetto Message. Restituisce True se il messaggio è valido, altrimenti False.
reset(nome)
Reimposta il valore assegnato per un campo, ripristinando il valore predefinito o, in assenza di un valore predefinito, su Nessuno.
Argomenti:
nome
Nome del campo da reimpostare.