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.