El módulo descriptor.py
contiene definiciones de mensajes y funciones para convertir las definiciones de la RPC del protocolo de Google en un formato de mensaje transmisible.
Cuando se describe una instancia de Enumeración, una clase de Enumeración, una clase de Campo o una clase de Mensaje se genera un objeto descriptor apropiado. Un objeto descriptor es un objeto que describe otras definiciones de la RPC del protocolo de Google como, por ejemplo, enumeraciones, mensajes y servicios. Puedes usar este mensaje para transmitir información a los clientes que deseen conocer la descripción de un valor de enumeración, campo o mensaje sin necesidad de descargar el código fuente. Este formato también es compatible con otros lenguajes que no sean Python.
Los descriptores se modelan para ser objetos binarios compatibles con https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/descriptor.proto
.
Nota: Los nombres de tipos y campos que se definen en descriptor.py
no necesariamente coinciden con los definidos en descriptor.proto
. La RPC del protocolo de Google está diseñada de esta manera para hacer que los archivos de código fuente que usan estos descriptores sean más fáciles de leer. Por ejemplo, FieldDescriptors debe tener el prefijo TYPE
en descriptor.proto
, pero no en descriptor.py
.
En la siguiente muestra de código, se explica el uso del módulo descriptor para describir una clase llamada Pixel
con 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 un descriptor. Puedes utilizar esta función auxiliar para describir cualquier objeto con un objeto descriptor apropiado.
Argumentos- value
- El valor a describir como un descriptor.
Muestra un descriptor si el objeto se puede describir como un descriptor, de lo contrario, Ninguno.
- describe_enum(enum_definition)
-
Compila un descriptor a partir de una clase de Enumeración.
Argumentos- enum_value
- La clase de Enumeración a describir.
Muestra una instancia inicializada de EnumDescriptor que describe la instancia de Enumeración.
Campos de la clase EnumDescriptor:
name
- El nombre de la Enumeración especificada sin ninguna calificación.
values
- Los valores que define la clase de Enumeración.
- describe_enum_value(enum_value)
-
Compila un descriptor a partir de una instancia de Enumeración. Argumentos
- enum_value
- El valor de Enumeración a describir.
Muestra una instancia inicializada de EnumValueDescriptor que describe la instancia de Enumeración.
Campos de la clase EnumValueDescriptor:
name
- El nombre del valor de enumeración.
number
- El número del valor de enumeración.
- describe_field(field_definition)
-
Compila un descriptor a partir de una instancia de Campo.
Argumentos- field_definition
- La instancia de Campo que se describirá.
Muestra una instancia inicializada de FieldDescriptor que describe la instancia de Campo con una lista de las Enumeraciones y los campos
Enumeraciones de la clase FieldDescriptor:
Variant
- Los subtipos con sugerencias de formato de cable para el campo especificado.
Label
- Los valores para los campos opcionales, obligatorios y repetidos.
Campos de la clase FieldDescriptor:
name
- El nombre del campo especificado.
number
- El número del campo especificado.
variant
- La variante del campo especificado.
type_name
- El nombre del tipo para los campos de mensaje y enumeración.
default_value
- Representación de string del valor predeterminado.
- describe_file(module)
-
Compila un archivo a partir de un módulo de Python especificado.
Argumentos- module
- El Python a describir.
Muestra una instancia inicializada de FileDescriptor que describe el módulo.
Campos de la clase FileDescriptor
package
- El nombre completo del paquete al que pertenecen las definiciones.
message_types
- Las definiciones de mensajes que se incluyen en el archivo.
enum_types
- Las definiciones de enumeraciones que se incluyen en el archivo.
service_types
- Las definiciones de servicios que se incluyen en el archivo.
- describe_file_set(modules)
-
Compila un conjunto de archivos a partir de los módulos de Python especificados.
Argumentos- modules
- La capacidad de repetición del módulo de Python para describir.
Muestra una instancia inicializada de FileSet que describe el módulo.
Campos de la clase FileSet:
files
- Los archivos en el conjunto de archivos.
- describe_message(message_definition)
-
Compila un descriptor a partir de una clase de Mensaje.
Argumentos- message_definition
- La clase de Mensaje a describir.
Muestra una instancia inicializada de MessageDescriptor que describe la clase de Mensaje.
Campos de la clase MessageDescriptor:
name
- El nombre completo del paquete al que pertenecen las definiciones.
fields
- Los campos definidos para el mensaje.
message_types
- Las clases Mensaje anidadas que se definen en el mensaje.
enum_types
- Las clases de Enumeración anidadas que se definen en el mensaje.
- describe_method(method)
-
Compila un descriptor a partir de un método de servicio remoto.
Argumentos- método
- El método de servicio remoto a describir.
Muestra una instancia inicializada de MethodDescriptor que describe el método de servicio remoto.
Campos de MethodDescriptor:
name
- El nombre del método de servicio.
request_type
- El nombre completo o el nombre relativo del tipo de mensaje de solicitud.
response_type
- El nombre completo o el nombre relativo del tipo de mensaje de respuesta.
- describe_service(service_class)
-
Compila un descriptor a partir de una clase de Servicio.
Argumentos- service_class
- La clase de Servicio a describir.
Muestra una instancia inicializada de ServiceDescriptor que describe el servicio.
Campos de ServiceDescriptor:
name
- El nombre no calificado del Servicio.
methods
- Los métodos remotos del Servicio.
- import_descriptor_loader(definition_name, definition_name=__import__ )
-
Encuentra objetos mediante la importación de módulos según sea necesario. Un cargador de definiciones es una función que decide un nombre de definición de un descriptor. El localizador de importación decide las definiciones de los nombres mediante la importación de módulos cuando sea necesario.
Argumentos- definition_name
- El nombre de la definición a buscar.
- importer=__import__ )
- La función de importación que se utiliza para importar módulos nuevos.
Muestra un descriptor apropiado a partir cualquier tipo descriptible ubicado por nombre.
Genera un error DefinitionNotFoundError cuando un nombre no hace referencia a una definición o un módulo.