Funções do módulo de descritores

O módulo descriptor.py contém definições de mensagens e funções para converter definições de RPC do protocolo Google num formato de mensagem transmissível.

A descrição de uma instância Enum, uma classe Enum, uma classe Field ou uma classe Message gera um objeto descritor adequado. Um objeto descritor é um objeto que descreve outras definições de RPC do protocolo Google, como enumerações, mensagens e serviços. Pode usar esta mensagem para transmitir informações a clientes que queiram saber a descrição de um valor de enumeração, uma enumeração, um campo ou uma mensagem sem terem de transferir o código fonte. Este formato também é compatível com outras linguagens que não sejam Python.

Os descritores são modelados para serem binariamente compatíveis com https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/descriptor.proto

Nota! Os nomes dos tipos e dos campos definidos em descriptor.py não correspondem necessariamente aos definidos em descriptor.proto. O RPC do Protocol Buffer da Google foi concebido desta forma para facilitar a leitura dos ficheiros de código fonte que usam estes descritores. Por exemplo, os FieldDescriptors têm de ter o prefixo TYPE em descriptor.proto, mas não em descriptor.py.

O seguinte exemplo de código demonstra a utilização do módulo de descritor para descrever uma classe denominada Pixel através da 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. Pode usar esta função auxiliar para descrever qualquer objeto com um objeto descritor adequado.

Argumentos
valor
Valor a descrever como um descritor.

Devolve um descritor se o objeto for descritível como um descritor. Caso contrário, devolve None.

describe_enum(enum_definition)

Cria um descritor a partir de uma classe Enum.

Argumentos
enum_value
A classe Enum a descrever.

Devolve uma instância EnumDescriptor inicializada que descreve a instância Enum.

Campos da classe EnumDescriptor:

name
Nome da enumeração especificada sem qualificações.
values
Valores definidos pela classe Enum.
describe_enum_value(enum_value)

Cria um descritor a partir de uma instância de enumeração. Argumentos

enum_value
O valor Enum a descrever.

Devolve uma instância EnumValueDescriptor inicializada que descreve a instância Enum.

Campos da classe EnumValueDescriptor:

name
Nome do valor de enumeração.
number
Número do valor de enumeração.
describe_field(field_definition)

Cria um descritor a partir de uma instância de campo.

Argumentos
field_definition
A instância do campo a descrever.

Devolve uma instância FieldDescriptor inicializada que descreve a instância Field com uma lista de enumerações e campos.

Enumerações da classe FieldDescriptor:

Variant
Subtipos de sugestões de formato de transmissão para o campo especificado.
Label
Valores para 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
Introduza o nome da mensagem e os campos enum.
default_value
Representação de string do valor predefinido.
describe_file(module)

Cria um ficheiro a partir de um módulo Python especificado.

Argumentos
module
O Python a descrever.

Devolve uma instância FileDescriptor inicializada que descreve o módulo.

Campos da classe FileDescriptor

package
Nome totalmente qualificado do pacote ao qual as definições pertencem.
message_types
Definições de mensagens contidas no ficheiro.
enum_types
Definições de enumeração contidas no ficheiro.
service_types
Definições de serviços contidas no ficheiro.
describe_file_set(modules)

Cria um conjunto de ficheiros a partir dos módulos Python especificados.

Argumentos
modules
Iterable do módulo Python a descrever.

Devolve uma instância FileSet inicializada que descreve o módulo.

Campos da classe FileSet:

files
Ficheiros no conjunto de ficheiros.
describe_message(message_definition)

Cria um descritor a partir de uma classe Message.

Argumentos
message_definition
A classe Message a descrever.

Devolve uma instância MessageDescriptor inicializada que descreve a classe Message.

Campos da classe MessageDescriptor:

name
Nome totalmente qualificado do pacote ao qual as definições pertencem.
fields
Campos definidos para a mensagem.
message_types
Classes de mensagens aninhadas definidas na mensagem.
enum_types
Classes Enum aninhadas definidas na mensagem.
describe_method(method)

Cria um descritor a partir de um método de serviço remoto.

Argumentos
método
O método de serviço remoto a descrever.

Devolve uma instância MethodDescriptor inicializada que descreve o método do serviço remoto.

Campos MethodDescriptor:

name
Nome do método de serviço.
request_type
Nome totalmente qualificado ou nome relativo do tipo de mensagem de pedido.
response_type
Nome totalmente qualificado ou relativo do tipo de mensagem de resposta.
describe_service(service_class)

Cria um descritor a partir de uma classe Service.

Argumentos
service_class
A classe de serviço a descrever.

Devolve uma instância ServiceDescriptor inicializada que descreve o serviço.

Campos ServiceDescriptor:

name
Nome não qualificado do serviço.
methods
Métodos remotos do Serviço.
import_descriptor_loader(definition_name, importer=__import__ )

Encontra objetos importando módulos conforme necessário. Um carregador de definições é uma função que resolve um nome de definição para um descritor. O localizador de importações resolve as definições para os respetivos nomes importando módulos quando necessário.

Argumentos
definition_name
Nome da definição a encontrar.
importer=__import__ )
Função de importação usada para importar novos módulos.

Devolve um descritor adequado de qualquer tipo descritível localizado por nome.

Gera um DefinitionNotFoundError quando um nome não se refere a uma definição nem a um módulo.