Funciones del módulo descriptor

El módulo descriptor.py contiene definiciones de mensajes y funciones para convertir definiciones de llamadas a procedimiento remoto (RPC) del protocolo de Google en un formato de mensaje transmisible.

Al describir una instancia de Enum, una clase Enum, una clase Field o una clase Message, se genera el objeto descriptor apropiado. Un objeto de descriptor es un objeto que describe otras definiciones de RPC de Protocol de Google, como enumeraciones, mensajes y servicios. Puedes utilizar este mensaje para transmitir información a los clientes que deseen conocer la descripción de un valor de Enum, un enum, un campo o un mensaje sin necesidad de descargar el código fuente. Este formato también es compatible con otros lenguajes distintos de Python.

Los descriptores se han diseñado para que sean compatibles con el formato binario de https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/descriptor.proto.

Nota: Los nombres de los tipos y los campos definidos en descriptor.py no tienen por qué coincidir con los definidos en descriptor.proto. El protocolo RPC de Google se ha diseñado de esta forma para que los archivos de código fuente que usan estos descriptores sean más fáciles de leer. Por ejemplo, los FieldDescriptors deben ir precedidos de TYPE en descriptor.proto, pero no en descriptor.py.

En el siguiente ejemplo de código se muestra cómo usar el módulo de descriptor para describir una clase llamada Pixel mediante la clase MessageDescriptor.

from protorpc import descriptor
from protorpc import messages

class Pixel(messages.Message):
    x = messages.IntegerField(1, required=True)
    y = messages.IntegerField(2, required=True)

    color = messages.BytesField(3)

# Describe Pixel class using message descriptor.  
fields = [
  descriptor.FieldDescriptor(name='x', 
                  number=1,
                  label=descriptor.FieldDescriptor.Label.REQUIRED,
                  variant=descriptor.FieldDescriptor.Variant.INT64),

  descriptor.FieldDescriptor(name='y', 
                  number=2,
                  label=descriptor.FieldDescriptor.Label.REQUIRED,
                  variant=descriptor.FieldDescriptor.Variant.INT64),

  descriptor.FieldDescriptor(name='color',
                  number = 3,
                  label=descriptor.FieldDescriptor.Label.OPTIONAL,
                  variant=descriptor.FieldDescriptor.Variant.BYTES)]

message = descriptor.MessageDescriptor(name='Pixel',
                                       fields=fields)

# Describing is the equivalent of building the above message.
message == descriptor.describe_message(Pixel)

El paquete protorpc.descriptor proporciona las siguientes funciones:

describe(value)

Describe cualquier valor como descriptor. Puedes utilizar esta función de ayuda para describir cualquier objeto con un objeto descriptor apropiado.

Argumentos
value
Valor que se va a describir como un descriptor.

Devuelve un descriptor si el objeto es descriptible como descriptor; de lo contrario, devuelve None.

describe_enum(enum_definition)

Crea un descriptor de una clase Enum.

Argumentos
enum_value
La clase Enum que se va a describir.

Devuelve una instancia de EnumDescriptor inicializada que describe la instancia de Enum.

Campos de la clase EnumDescriptor:

name
Nombre del enum especificado sin ninguna cualificación.
values
Valores definidos por la clase Enum.
describe_enum_value(enum_value)

Crea un descriptor de una instancia de Enum. Argumentos

enum_value
Valor de enumeración que se va a describir.

Devuelve una instancia de EnumValueDescriptor inicializada que describe la instancia de Enum.

Campos de la clase EnumValueDescriptor:

name
Nombre del valor de enumeración.
number
Número del valor de enumeración.
describe_field(field_definition)

Crea un descriptor a partir de una instancia de Field.

Argumentos
field_definition
Instancia de Field que se va a describir.

Devuelve una instancia de FieldDescriptor que describe la instancia de Field con una lista de enums y campos.

Enums de la clase FieldDescriptor:

Variant
Subtipos de sugerencias de formato de cable para el campo especificado.
Label
Valores de los campos opcionales, obligatorios y repetidos.

Campos de la clase FieldDescriptor:

name
Nombre del campo especificado.
number
Número del campo especificado.
variant
Variante del campo especificado.
type_name
Escribe el nombre de los campos de mensaje y enum.
default_value
Representación de cadena del valor predeterminado.
describe_file(módulo)

Crea un archivo a partir de un módulo Python especificado.

Argumentos
module
El Python que se va a describir.

Devuelve una instancia de FileDescriptor inicializada que describe el módulo.

Campos de la clase FileDescriptor

package
Nombre completo del paquete al que pertenecen las definiciones.
message_types
Definiciones de mensajes contenidas en el archivo.
enum_types
Definiciones de enumeraciones contenidas en el archivo.
service_types
Definiciones de servicio incluidas en el archivo.
describe_file_set(modules)

Crea un conjunto de archivos a partir de los módulos Python especificados.

Argumentos
modules
Iterable del módulo de Python que se va a describir.

Devuelve una instancia de FileSet inicializada que describe el módulo.

Campos de la clase FileSet:

files
Archivos del conjunto de archivos.
describe_message(message_definition)

Crea un descriptor a partir de una clase Message.

Argumentos
message_definition
Clase Message que se va a describir.

Devuelve una instancia de MessageDescriptor inicializada que describe la clase Message.

Campos de la clase MessageDescriptor:

name
Nombre completo del paquete al que pertenecen las definiciones.
fields
Campos definidos para el mensaje.
message_types
Clases de mensajes anidadas definidas en el mensaje.
enum_types
Clases Enum anidadas definidas en el mensaje.
describe_method(método)

Crea un descriptor a partir de un método de servicio remoto.

Argumentos
método
El método de servicio remoto que se va a describir.

Devuelve una instancia de MethodDescriptor inicializada que describe el método de servicio remoto.

Campos de MethodDescriptor:

name
Nombre del método del servicio.
request_type
Nombre completo o relativo del tipo de mensaje de solicitud.
response_type
Nombre completo o relativo del tipo de mensaje de respuesta.
describe_service(service_class)

Crea un descriptor a partir de una clase Service.

Argumentos
service_class
La clase de servicio que se va a describir.

Devuelve una instancia de ServiceDescriptor inicializada que describe el servicio.

Campos de ServiceDescriptor:

name
Nombre no cualificado del servicio.
methods
Métodos remotos del Servicio.
import_descriptor_loader(definition_name, importer=__import__ )

Encuentra objetos importando módulos según sea necesario. Un cargador de definiciones es una función que resuelve un nombre de definición en un descriptor. El buscador de importaciones resuelve las definiciones en sus nombres importando módulos cuando es necesario.

Argumentos
definition_name
Nombre de la definición que se va a buscar.
importer=__import__ )
Función de importación que se usa para importar módulos nuevos.

Devuelve un descriptor apropiado a partir de cualquier tipo descriptible localizándolo por su nombre.

Genera un error DefinitionNotFoundError cuando un nombre no hace referencia a una definición ni a un módulo.