Das Modul descriptor.py
enthält Nachrichtendefinitionen und Funktionen zum Konvertieren von Google Protocol-RPC-Definitionen in ein übertragbares Nachrichtenformat.
Durch die Beschreibung einer Enum-Instanz, Enum-Klasse, Field-Klasse oder Message-Klasse wird ein entsprechendes Deskriptorobjekt erzeugt. Ein Deskriptorobjekt ist ein Objekt, das andere Google Protocol-RPC-Definitionen wie Enums, Nachrichten und Dienste beschreibt. Sie können mit dieser Nachricht Informationen an Clients übermitteln, die die Beschreibung eines Enumerationswerts, einer Enumeration, eines Felds oder einer Nachricht kennen möchten, ohne den Quellcode herunterladen zu müssen. Dieses Format ist auch mit anderen Programmiersprachen als Python kompatibel.
Die Deskriptoren werden so dargestellt, dass sie mit https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/descriptor.proto
binär kompatibel sind.
Hinweis! Die Namen der Typen und Felder, die in descriptor.py
definiert sind, entsprechen nicht notwendigerweise den Definitionen in descriptor.proto
. Google Protocol RPC ist so konzipiert, damit Quellcodedateien, die diese Deskriptoren verwenden, leichter lesbar sind. Ein FieldDescriptor muss beispielsweise in descriptor.proto
das Präfix TYPE
erhalten, jedoch nicht in descriptor.py
.
Das folgende Codebeispiel zeigt die Verwendung des Deskriptormoduls zur Beschreibung einer Klasse namens Pixel
mit der Klasse 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)
Das protorpc.descriptor
-Paket bietet folgende Funktionen:
- describe(value)
-
Beschreibt jeden beliebigen Wert als Deskriptorobjekt. Sie können mit dieser Hilfsfunktion jedes Objekt mit einem entsprechenden Deskriptorobjekt beschreiben.
Argumente- Wert
- Wert für die Beschreibung als Deskriptorobjekt
Gibt ein Deskriptorobjekt zurück, wenn das Objekt als Deskriptor beschreibbar ist. Andernfalls wird "None" zurückgegeben.
- describe_enum(enum_definition)
-
Erstellt einen Deskriptor aus einer Enumerationsklasse.
Argumente- enum_value
- Die zu beschreibende Enumerationsklasse
Gibt eine initialisierte EnumDescriptor-Instanz zurück, die die Enumerationsinstanz beschreibt.
Felder der EnumDescriptor-Klasse:
name
- Name der angegebenen Enumeration ohne Qualifikationen.
values
- Von der Enumerationsklasse definierte Werte
- describe_enum_value(enum_value)
-
Erstellt einen Deskriptor aus einer Enumerationsklasse. Argumente
- enum_value
- Der zu beschreibende Enumerationswert
Gibt eine initialisierte EnumValueDescriptor-Instanz zurück, die die Enumerationsinstanz beschreibt.
Felder der EnumValueDescriptor-Klasse:
name
- Name des Enumerationswerts.
number
- Nummer des Enumerationswerts
- describe_field(field_definition)
-
Erstellt eine Beschreibung aus einer Field-Instanz.
Argumente- field_definition
- Die zu beschreibende Field-Instanz
Gibt eine initialisierte FieldDescriptor-Instanz zurück, die die Field-Instanz mit einer Liste aus Enumerationen und Feldern beschreibt.
Enumerationen der FieldDescriptor-Klasse:
Variant
- Hinweis-Untertypen im Sendeformat für das angegebene Feld.
Label
- Werte für optionale, erforderliche und wiederholte Felder
Felder der FieldDescriptor-Klasse:
name
- Name des angegebenen Felds.
number
- Nummer des angegebenen Felds.
variant
- Variante des angegebenen Felds.
type_name
- Typname für die Nachrichten- und Enumerationsfelder.
default_value
- String-Darstellung des Standardwerts
- describe_file(module)
-
Erstellt eine Datei aus einem angegebenen Python-Modul.
Argumente- module
- Das zu beschreibende Python-Modul
Gibt eine initialisierte FileDescriptor-Instanz zurück, die das Modul beschreibt.
Felder der FileDescriptor-Klasse:
package
- Voll qualifizierter Name des Pakets, zu dem die Definitionen gehören.
message_types
- In der Datei enthaltene Nachrichtendefinitionen.
enum_types
- In der Datei enthaltene Enumerationsdefinitionen.
service_types
- In der Datei enthaltene Dienstdefinitionen
- describe_file_set(modules)
-
Erstellt eine Dateigruppe aus den angegebenen Python-Modulen.
Argumente- modules
- Iterierbares Element des zu beschreibenden Python-Moduls
Gibt eine initialisierte FileSet-Instanz zurück, die das Modul beschreibt.
Felder der FileSet-Klasse:
files
- Dateien in der Dateigruppe
- describe_message(message_definition)
-
Erstellt eine Beschreibung aus einer Message-Klasse.
Argumente- message_definition
- Die zu beschreibende Message-Klasse
Gibt eine initialisierte MessageDescriptor-Instanz zurück, die die Message-Klasse beschreibt.
Felder der MessageDescriptor-Klasse:
name
- Voll qualifizierter Name des Pakets, zu dem die Definitionen gehören.
fields
- Für die Nachricht definierte Felder.
message_types
- Verschachtelte Message-Klassen, die bei der Nachricht definiert wurden.
enum_types
- Verschachtelte Enum-Klassen, die bei der Nachricht definiert wurden
- describe_method(method)
-
Erstellt eine Beschreibung aus einer Remotedienst-Methode.
Argumente- method
- Die zu beschreibende Remotedienst-Methode
Gibt eine initialisierte MethodDescriptor-Instanz zurück, die die Remotedienst-Methode beschreibt.
MethodDescriptor-Felder:
name
- Name der Dienstmethode.
request_type
- Voll qualifizierter Name oder relativer Name des Anforderungsnachrichtentyps.
response_type
- Voll qualifizierter oder relativer Name des Antwortnachrichtentyps
- describe_service(service_class)
-
Erstellt eine Beschreibung aus einer Dienstklasse.
Argumente- service_class
- Die zu beschreibende Dienstklasse
Gibt eine initialisierte ServiceDescriptor-Instanz zurück, die den Dienst beschreibt.
ServiceDescriptor-Felder:
name
- Nicht qualifizierter Name des Dienstes.
methods
- Remote-Methoden des Diensts
- import_descriptor_loader(definition_name, importer=__import__ )
-
Findet Objekte, indem nach Bedarf Module importiert werden. Ein Definitions-Loader ist eine Funktion, die einen Definitionsnamen in einen Deskriptor auflöst. Die Importsuche löst Definitionen in ihre Namen auf, indem bei Bedarf Module importiert werden.
Argumente- definition_name
- Name der zu suchenden Definition.
- importer=__import__ )
- Importfunktion für den Import neuer Module
Gibt einen entsprechenden Deskriptor jedes beschreibbaren Typs zurück, der nach Name gefunden wurde.
Löst einen DefinitionNotFoundError aus, wenn sich ein Name weder auf eine Definition noch auf ein Modul bezieht.