La clase Message

La clase Message se usa para definir mensajes y lograr una transmisión eficiente en la red o el espacio de los procesos. Los mensajes se definen con clases de campo.

El módulo protorpc.messages proporciona Message.

Introducción

Los mensajes están más restringidos que las clases normales, ya que solo pueden contener atributos de campo y otras definiciones de Message y Enum. Estas restricciones se usan porque la estructura de la clase Message en sí misma está diseñada para transmitirse a través de una red o espacio de proceso y usarse de forma directa por los clientes o incluso otros servidores. Por lo tanto, los métodos y los atributos que no son de campo no se pueden transmitir con información estructural, la cual causa discrepancias entre distintas implementaciones y lenguajes.

Inicialización y validación

Un objeto Message se considera inicializado si tiene todos los campos obligatorios y si además se inicializaron los mensajes anidados.

Llamar a “check_initialized” generará un ValidationError si no está inicializado; “is_initialized” muestra un valor booleano que indica si es válido.

El RPC del protocolo de Google valida los objetos Message de forma automática cuando se crean y se propagan. Tu aplicación puede validar si un valor dado es compatible con un campo al cual se le asigna si se usa el método validate() de la instancia de Field. Cuando se usa en un mensaje, este método comprueba que todos los valores de un mensaje y sus submensajes sean válidos. Asignar un valor no válido a un campo genera un ValidationError.

En el ejemplo siguiente, se crean y luego inicializan objetos Message en una aplicación de negociación de acciones ficticia.

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

Constructor

El constructor de la clase Message se define de la siguiente forma:

class Message(**kwargs)

Inicializa el estado de los mensajes internos.

Una aplicación inicializa un mensaje con el constructor mediante el paso de argumentos de palabras clave que corresponden a clases de campo. Por ejemplo:

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

Después de definir el campo de clase puedes invocar valores de campo de forma concreta. Las dos invocaciones siguientes son equivalentes:

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

Es equivalente a:

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

Métodos de clase

La clase Message proporciona los siguientes métodos de clase:

all_fields()
Obtiene todos los objetos de definición de campos. Muestra un iterador sobre todos los valores en un orden arbitrario.
field_by_name(name)
Obtiene los campos por nombre. Muestra un objeto Field asociado con el nombre.
Genera un KeyError si no se encuentra un campo con ese nombre.
field_by_number(number)
Obtiene un campo por nombre. Muestra el objeto de campo asociado con ese número.
Genera un KeyError si no se encuentra un campo con ese número.

Métodos de instancia

Las instancias de Message tienen los métodos siguientes:

check_initialized()
Comprueba que todos los campos obligatorios se hayan inicializado.
Genera un ValidationError si no se inicializó el objeto Message.
get_assigned_value(name)
Obtiene el valor asignado de un atributo. Si no se configura el valor, muestra None.
Argumentos:
name
El nombre del atributo a obtener.

Muestra el valor asignado de un atributo o None si el atributo no tiene un valor asignado.

is_initialized(name)
Obtiene el estado de inicialización para el estado del objeto Message. Muestra True si el mensaje es válido; de lo contrario, muestra False.
reset(name)
Restablece el valor asignado para un campo, el cual restablece el valor predeterminado o, si este no existe, el valor None.
Argumentos:
name
Nombre del campo que se debe restablecer.