La clase Message se utiliza para definir mensajes para una transmisión eficaz por la red o por el espacio de procesamiento. Los mensajes se definen mediante clases de campo.
Message
lo proporciona el módulo protorpc.messages
.
Introducción
Los mensajes están más restringidos que las clases normales. Solo pueden contener atributos de campo y otras definiciones de mensaje y de Enum. Estas restricciones se aplican porque la estructura de la clase Message se ha diseñado para transmitirse a través de una red o un espacio de proceso y para que los clientes u otros servidores la usen directamente. Por lo tanto, los métodos y los atributos que no son de campo no pueden transmitirse junto con información estructural, ya que provoca discrepancias entre los distintos lenguajes e implementaciones.
Inicialización y validación
Un objeto Message se considera inicializado cuando todos sus campos obligatorios y mensajes anidados también lo estén.
Si se llama a "check_initialized" y no se ha inicializado, se generará un error ValidationError. "is_initialized" devuelve un valor booleano que indica si es válido.
La llamada a procedimiento remoto (RPC) del protocolo de Google valida automáticamente los objetos Message cuando se crean y se rellenan. Tu aplicación puede validar si un valor determinado es compatible con un campo al que se le ha asignado mediante el método validate() de la instancia Field. Cuando se usa en un mensaje, el método comprueba que todos los valores de un mensaje y sus submensajes sean válidos. Si se asigna un valor no válido a un campo, se genera un error ValidationError.
El siguiente ejemplo crea e inicializa objetos Message en una aplicación de compraventa 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 a continuación:
- class Message(**kwargs)
-
Inicializa el estado de los mensajes internos.
Una aplicación inicializa un mensaje a través del constructor pasando argumentos de palabras clave correspondientes a clases de campo. Por ejemplo:
class Date(Message) day = IntegerField(1) month = IntegerField(2) year = IntegerField(3)
Una vez que hayas definido el campo de clase, podrás invocar los valores de los campos de forma concisa. Estas dos invocaciones serían equivalentes:
date = Date(day=6, month=6, year=1911)
Equivale 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 campo. Devuelve un elemento iterador de todos los valores en orden arbitrario.
- field_by_name(name)
- Obtiene campos por nombre. Devuelve un objeto Field asociado con el nombre.
- Genera un KeyError si no se encuentra ningún campo con ese nombre.
- field_by_number(number)
- Obtiene un campo por número. Devuelve un objeto Field asociado con el número.
- Genera un KeyError si no se encuentra ningún campo con ese número.
Métodos de instancia
Las instancias de Message tienen los siguientes métodos:
- check_initialized()
- Comprueba que se hayan inicializado todos los campos obligatorios.
- Genera un ValidationError si el objeto Message no se ha inicializado.
- get_assigned_value(name)
- Obtiene el valor asignado de un atributo. Si no se ha especificado un valor, devuelve None.
- Argumentos:
- name
- Nombre del atributo que se va a obtener.
Devuelve el valor asignado de un atributo o, si el atributo no tiene ningún valor, None.
- is_initialized(name)
- Obtiene el estado de inicialización del objeto Message. Devuelve
True
si el mensaje es válido; de lo contrario, devuelveFalse
. - reset(nombre)
- Restablece el valor asignado a un campo, lo que vuelve a establecer el valor predeterminado o, si no hay ningún valor predeterminado, None.
- Argumentos:
- name
- Nombre del campo que se va a restablecer.