Funzioni del modulo dei descrittori

Il modulo descriptor.py contiene le definizioni dei messaggi e le funzioni per convertire le definizioni RPC del protocollo Google in un formato di messaggi trasmettebile.

La descrizione di un'istanza Enum, una classe Enum, una classe Field o una classe Message genera un oggetto descrittore appropriato. Un oggetto descrittore è un oggetto che descrive altre definizioni RPC del protocollo Google, come enum, messaggi e servizi. Puoi utilizzare questo messaggio per trasmettere informazioni ai client che vogliono conoscere la descrizione di un valore enum, di un'enumerazione, di un campo o di un messaggio senza dover scaricare il codice sorgente. Questo formato è compatibile anche con altri linguaggi non Python.

I descrittori sono modellati in modo da essere compatibili con i file binari con https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/descriptor.proto

Nota: I nomi dei tipi e dei campi definiti in descriptor.py non corrispondono necessariamente a quelli definiti in descriptor.proto. Il protocollo Google RPC è progettato in questo modo per semplificare la lettura dei file di codice sorgente che utilizzano questi descrittori. Ad esempio, i campi FieldDescriptor devono avere il prefisso TYPE in descriptor.proto, ma non in descriptor.py.

Il seguente esempio di codice mostra l'utilizzo del modulo descrittore per descrivere una classe denominata Pixel utilizzando la 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)

Il pacchetto protorpc.descriptor offre le seguenti funzioni:

describe(value)

Descrive qualsiasi valore come descrittore. Puoi utilizzare questa funzione di supporto per descrivere qualsiasi oggetto con un oggetto descrittore appropriato.

Argomenti
value
Valore da descrivere come descrittore.

Restituisce un descrittore se l'oggetto è descrivibile come descrittore, altrimenti None.

describe_enum(enum_definition)

Consente di creare un descrittore da una classe Enum.

Argomenti
enum_value
La classe Enum da descrivere.

Restituisce un'istanza EnumDescriptor inizializzata che descrive l'istanza Enum.

Campi della classe EnumDescriptor:

name
Nome dell'enum specificato senza qualifiche.
values
Valori definiti dalla classe Enum.
describe_enum_value(enum_value)

Consente di creare un descrittore da un'istanza Enum. Argomenti

enum_value
Il valore enum da descrivere.

Restituisce un'istanza EnumValueDescriptor inizializzata che descrive l'istanza Enum.

Campi della classe EnumValueDescriptor:

name
Nome del valore di enumerazione.
number
Numero del valore di enumerazione.
describe_field(field_definition)

Consente di creare un descrittore da un'istanza Field.

Argomenti
field_definition
L'istanza Field da descrivere.

Restituisce un'istanza FieldDescriptor inizializzata che descrive l'istanza Field con un elenco di enum e campi.

Enum delle classi FieldDescriptor:

Variant
Sottotipi di suggerimenti per il formato del cavo per il campo specificato.
Label
Valori per i campi facoltativi, obbligatori e ripetuti.

Campi della classe FieldDescriptor:

name
Nome del campo specificato.
number
Numero del campo specificato.
variant
Variante del campo specificato.
type_name
Digita il nome per i campi message ed enum.
default_value
Rappresentazione in formato stringa del valore predefinito.
describe_file(module)

Crea un file da un modulo Python specificato.

Argomenti
modulo
Il Python da descrivere.

Restituisce un'istanza di FileDescriptor inizializzata che descrive il modulo.

Campi classe FileDescriptor

package
Nome completo del pacchetto a cui appartengono le definizioni.
message_types
Definizioni dei messaggi contenuti nel file.
enum_types
Definizioni enum contenute nel file.
service_types
Definizioni dei servizi contenute nel file.
describe_file_set(moduli)

Crea un set di file dai moduli Python specificati.

Argomenti
moduli
È possibile descrivere il modulo Python.

Restituisce un'istanza FileSet inizializzata che descrive il modulo.

Campi della classe FileSet:

files
File nel set di file.
describe_message(message_definition)

Consente di creare un descrittore da una classe Message.

Argomenti
message_definition
La classe Message da descrivere.

Restituisce un'istanza MessageDescriptor inizializzata che descrive la classe Message.

Campi della classe MessageDescriptor:

name
Nome completo del pacchetto a cui appartengono le definizioni.
fields
Campi definiti per il messaggio.
message_types
Classi di messaggi nidificati definite nel messaggio.
enum_types
Classi enum nidificate definite nel messaggio.
describe_method(method)

Crea un descrittore da un metodo di servizio remoto.

Argomenti
method
Il metodo del servizio remoto da descrivere.

Restituisce un'istanza MethodDescriptor inizializzata che descrive il metodo del servizio remoto.

Campi MethodDescriptor:

name
Nome del metodo del servizio.
request_type
Nome completo o nome relativo del tipo di messaggio di richiesta.
response_type
Nome completo o relativo del tipo di messaggio di risposta.
describe_service(service_class)

Crea un descrittore da una classe Service.

Argomenti
service_class
La classe Service da descrivere.

Restituisce un'istanza ServiceDescriptor inizializzata che descrive il servizio.

Campi ServiceDescriptor:

name
Nome non qualificato del Servizio.
methods
Metodi remoti del servizio.
import_descriptor_loader(definition_name, importer=__import__ )

Trova gli oggetti importando i moduli in base alle esigenze. Un caricatore di definizioni è una funzione che risolve un nome definizione in un descrittore. Il cercatore di importazioni risolve le definizioni nei relativi nomi importando i moduli, se necessario.

Argomenti
definition_name
Nome della definizione da trovare.
importer=__import__ )
Funzione di importazione utilizzata per importare nuovi moduli.

Restituisce un descrittore appropriato da qualsiasi tipo di descrizione posizionato per nome.

Genera un DefinitionNotFoundError quando un nome non fa riferimento a una definizione né a un modulo.