O módulo descriptor.py
contém definições e funções de mensagem para converter definições de RPC do protocolo do Google em um formato de mensagem transmissível.
Descrever uma instância de Enum, classe Enum, classe Field ou classe Message gera um objeto descritor apropriado. Um objeto descritor é um objeto que descreve outras definições de RPC do protocolo do Google, como enums, mensagens e serviços. Você pode usar essa mensagem para transmitir informações para clientes que querem saber a descrição de um valor de enum, enum, campo ou mensagem sem precisar fazer download do código-fonte. Esse formato também é compatível com outras linguagens além de Python.
Os descritores são modelados para serem binários compatíveis com https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/descriptor.proto
Observação! Os nomes de tipos e campos definidos em descriptor.py
não correspondem necessariamente aos definidos em descriptor.proto
. O RPC do protocolo do Google foi projetado dessa maneira para facilitar a leitura dos arquivos de código-fonte que usam esses descritores. Por exemplo, FieldDescriptors precisam do prefixo com TYPE
em descriptor.proto
, mas não em descriptor.py
.
O exemplo de código a seguir demonstra o uso do módulo descritor para descrever uma classe chamada Pixel
usando a classe 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)
O pacote protorpc.descriptor
oferece as seguintes funções:
- describe(value)
-
Descreve qualquer valor como um descritor. Você pode usar essa função assistente para descrever qualquer objeto com um objeto descritor apropriado.
Argumentos- value
- O valor a ser descrito como um descritor.
Retorna um descritor se o objeto puder ser descrito como um descritor, ou None.
- describe_enum(enum_definition)
-
Constrói um descritor a partir de uma classe Enum.
Argumentos- enum_value
- A classe Enum a ser descrita.
Retorna uma instância de EnumDescriptor inicializada que descreve a instância de Enum.
Campos da classe EnumDescriptor:
name
- Nome da Enum especificada sem nenhuma qualificação.
values
- Valores definidos pela classe Enum.
- describe_enum_value(enum_value)
-
Constrói um descritor a partir de uma instância de Enum. Argumentos
- enum_value
- O valor de Enum a ser descrito.
Retorna uma instância de EnumValueDescriptor inicializada que descreve a instância de Enum.
Campos da classe EnumValueDescriptor:
name
- Nome do valor de enumeração.
number
- Número do valor de enumeração.
- describe_field(field_definition)
-
Constrói um descritor a partir de uma instância de Field.
Argumentos- field_definition
- A instância de Field a ser descrita.
Retorna uma instância de FieldDescriptor inicializada que descreve a instância de Field com uma lista de Enums e campos.
Enums da classe FieldDescriptor:
Variant
- O formato wire indica os subtipos do campo especificado.
Label
- Valores de campos opcionais, obrigatórios e repetidos.
Campos da classe FieldDescriptor:
name
- Nome do campo especificado.
number
- Número do campo especificado.
variant
- Variante do campo especificado.
type_name
- Nome do tipo dos campos de mensagem e enum.
default_value
- Representação de string do valor padrão.
- describe_file(module)
-
Constrói a partir de um arquivo de um módulo Python especificado.
Argumentos- module
- O Python a ser descrito.
Retorna uma instância de FileDescriptor que descreve o módulo.
Campos da classe FileDescriptor
package
- Nome totalmente qualificado do pacote ao qual pertencem as definições.
message_types
- Definições de mensagens contidas no arquivo.
enum_types
- Definições de enum contidas no arquivo.
service_types
- Definições de serviço contidas no arquivo.
- describe_file_set(modules)
-
Constrói um conjunto de arquivos dos módulos Python especificados.
Argumentos- modules
- Iterável do módulo Python a ser descrito.
Retorna uma instância de FileSet inicializada que descreve o módulo.
Campos da classe FileSet:
files
- Arquivos no conjunto de arquivos.
- describe_message(message_definition)
-
Constrói um descritor a partir de uma classe Message.
Argumentos- message_definition
- A classe Message a ser descrita.
Retorna uma instância de MessageDescriptor inicializada que descreve a classe Message.
Campos da classe MessageDescriptor:
name
- Nome totalmente qualificado do pacote ao qual pertencem as definições.
fields
- Campos definidos para a mensagem.
message_types
- Classes Nested Message definidas na mensagem.
enum_types
- Classes Nested Enum definidas na mensagem.
- describe_method(method)
-
Constrói um descritor a partir de um método de serviço remoto.
Argumentos- O método de serviço remoto a ser descrito.
Retorna uma instância de MethodDescriptor inicializada que descreve o método de serviço remoto.
Campos de MethodDescriptor:
name
- Nome do método de serviço.
request_type
- Nome totalmente qualificado ou nome relativo do tipo de mensagem de solicitação.
response_type
- Nome totalmente qualificado ou nome relativo ou do tipo de mensagem de resposta.
- describe_service(service_class)
-
Constrói um descritor a partir de uma classe Service.
Argumentos- service_class
- A classe Service a ser descrita.
Retorna uma instância de ServiceDescriptor inicializada que descreve o serviço.
Campos de ServiceDescriptor:
name
- Nome não qualificado de Service.
methods
- Métodos remotos do Serviço.
- import_descriptor_loader(definition_name, definition_name=__import__ )
-
Encontra objetos por meio da importação de módulos conforme necessário. Um carregador de definição é uma função que resolve um nome de definição para um descritor. O localizador de importação resolve definições para seus nomes por meio da importação de módulos quando necessário.
Argumentos- definition_name
- Nome da definição a ser encontrada.
- importer=__import__ )
- Função de importação usada para importar novos módulos.
Retorna um descritor apropriado de qualquer tipo que possa ser descrito localizado pelo nome.
É gerado um erro DefinitionNotFoundError quando um nome não se refere a uma definição ou um módulo.