Il modulo descriptor.py contiene definizioni di messaggi e funzioni per la conversione delle definizioni RPC del protocollo Google in un formato di messaggio trasmissibile.
La descrizione di un'istanza Enum, di una classe Enum, di una classe Field o di 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, un enum, un campo o un messaggio di un enum senza dover scaricare il codice sorgente. Questo formato è compatibile anche con altri linguaggi diversi da Python.
I descrittori sono progettati per essere compatibili in formato binario 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. Google Protocol 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 fornisce 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 alcuna qualifica.
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 della classe 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 come stringa del valore predefinito.
- describe_file(module)
-
Genera un file da un modulo Python specificato.
Argomenti- module
- Il codice Python da descrivere.
Restituisce un'istanza di FileDescriptor inizializzata che descrive il modulo.
Campi della classe FileDescriptor
package- Nome completo del pacchetto a cui appartengono le definizioni.
message_types- Definizioni dei messaggi contenute nel file.
enum_types- Definizioni di enum contenute nel file.
service_types- Definizioni dei servizi contenute nel file.
- describe_file_set(modules)
-
Genera un insieme di file dai moduli Python specificati.
Argomenti- modules
- Iterable del modulo Python da descrivere.
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 di 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 nidificate definite nel messaggio.
enum_types- Classi Enum nidificate definite nel messaggio.
- describe_method(method)
-
Consente di creare un descrittore da un metodo del servizio remoto.
Argomenti- method
- Il metodo del servizio remoto da descrivere.
Restituisce un'istanza di MethodDescriptor inizializzata che descrive il metodo del servizio remoto.
Campi MethodDescriptor:
name- Nome del metodo del servizio.
request_type- Nome completo o relativo del tipo di messaggio di richiesta.
response_type- Nome completo o relativo del tipo di messaggio di risposta.
- describe_service(service_class)
-
Consente di creare un descrittore da una classe Service.
Argomenti- service_class
- La classe di servizio da descrivere.
Restituisce un'istanza di 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 di 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 descrivibile trovato per nome.
Genera un DefinitionNotFoundError quando un nome non fa riferimento a una definizione o a un modulo.