Méthodes gRPC utilisées lors du traitement du type de tampons de protocole dans Python CopyFrom, Extend

Lorsque vous utilisez gRPC avec python, vous utiliserez le type protocolbuffer (pb2). Il y a quelques points à prendre en compte lors du traitement de ce type de tampon de protocole, je vais donc le résumer dans l'article.

Traitement d'attribution de type de tampon de protocole à l'aide de la méthode CopyFrom

Par exemple, si vous avez la définition de proto suivante: Conception simple avec une seule méthode.

user.proto



service UserService {
  rpc GetUser(GetUserRequest) returns (User) {}
}

message Size {
  int32 height = 1;
  int32 weight = 2;
}

message User {
  string id = 1;
  string name = 2;
  Size size = 3;
}

message GetUserRequest {
  string user_id = 1;
}

Ce qui suit est un exemple d'implémentation côté serveur de UserService utilisant le fichier proto ci-dessus.

import user_pb2

class UserService():
  def GetUser(self, request, context):
    #obtenir l'utilisateur de db
    db_user = db.get(request.user_id)
    
    #Définir la taille et ajouter de la valeur
    size = user_pb2.Size()
    size.height = db_user.height
    size.weight = db_user.weight

    #Définissez l'utilisateur, ajoutez de la valeur et retournez
    user = user_pb2.User()
    user.id = db_user.id
    user.name = db_user.name
    user.size = size

    return user

Lorsque j'exécute la méthode GetUser ci-dessus, j'obtiens une erreur avec TypeError. Le problème est l'avant-dernière ligne de code ʻuser.size = size`.

La taille, qui est un type d'objet du type Taille, est identique au type de taille défini dans le type Utilisateur, mais si vous l'affectez tel quel, une erreur se produira. La méthode utilisée ici est CopyFrom. En réécrivant la partie problématique du code ci-dessus comme suit, le code sera exécuté sans TypeError.

import user_pb2

class UserService():
  def GetUser(self, request, context):
    #obtenir l'utilisateur de db
    db_user = db.get(request.user_id)
    
    #Définir la taille et ajouter de la valeur
    size = user_pb2.Size()
    size.height = db_user.height
    size.weight = db_user.weight

    #Définissez l'utilisateur, ajoutez de la valeur et retournez
    user = user_pb2.User()
    user.id = db_user.id
    user.name = db_user.name
    user.size.CopyFrom(size)

    return user

Même si vous comparez à l'aide de la méthode Type, il est difficile de le remarquer car l'objet de taille est un type de taille, mais lorsque vous l'affectez en tant que type de tampon de protocole, vous ne pouvez pas l'affecter correctement sauf si vous utilisez CopyFrom.

Attribution de type répétée à l'aide d'Extend

Même avec des définitions répétées, il y a quelques points à prendre en compte lors de l'attribution. Ceci est expliqué à l'aide du fichier proto suivant, qui est une réécriture du UserService précédent.

User.proto



service UserService {
  rpc GetUser(GetUserRequest) returns (User) {}
}

message Item {
  string id = 1;
  string name = 2;
}

message User {
  string id = 1;
  string name = 2;
  repeated Item items = 3;
}

message GetUserRequest {
  string user_id = 1;
}

J'ai changé la taille en un type répété appelé éléments. Vous trouverez ci-dessous le code UserService.

import user_pb2

class UserService():
  def GetUser(self, request, context):
    #obtenir l'utilisateur de db
    db_user = db.get(request.user_id)
    
    #Définissez plusieurs éléments et créez une liste d'éléments
    item1 = user_pb2.Item()
    item1.id = '1'
    item1.name = 'item1'

    item2 = user_pb2.Item()
    item2.id = '2'
    item2.name = 'item2'

    items = [item1, item2]

    #Définissez l'utilisateur, ajoutez de la valeur et retournez
    user = user_pb2.User()
    user.id = db_user.id
    user.name = db_user.name
    user.items = items

    return user

Lorsque j'exécute le code ci-dessus, j'obtiens toujours un TypeError. La partie problématique est également la partie de ʻuser.items = items`. Utilisez la méthode extend pour affecter à un champ répété.

    user.items.extend(items)

En utilisant extend comme décrit ci-dessus, il est possible de définir la valeur sur le type du tableau.

J'ai vérifié sur la page officielle de google etc. pourquoi il est nécessaire de le gérer comme ça, mais cela n'a pas été bien expliqué. Le tampon de protocole semble avoir une habitude sur Python, alors utilisez-le avec prudence!

Recommended Posts

Méthodes gRPC utilisées lors du traitement du type de tampons de protocole dans Python CopyFrom, Extend
Précautions lors du traitement du type ROS MultiArray en Python
Précautions lors du traitement des structures de contrôle dans Python 2.6
Encodage de caractères lors du traitement de fichiers en Python 3
Sortie japonaise lors de l'utilisation de python dans Visual Studio
Lire les données des tampons de protocole avec Python3
Jusqu'à traiter de python dans Atom
Conseils pour gérer les binaires en Python
Mettez des tampons de protocole dans sqlite avec python
Gérer les "années et mois" en Python
[Python] Traitement de plusieurs erreurs d'appel dans ray.init
Pour pouvoir utiliser le japonais avec Python dans l'environnement Docker
Sélection de la boîte aux lettres lors de la récupération de Gmail avec imaplib de python
Organiser les types en Python
Problème de ne pas connaître les paramètres lors de l'utilisation de Blender à partir de Python
Précautions lors de l'utilisation de Python avec AtCoder
Scripts pouvant être utilisés lors de l'utilisation de Bottle en Python
Choses à garder à l'esprit lors de l'utilisation de cgi avec python.
Voici un résumé des choses qui pourraient être utiles pour traiter des nombres complexes en Python
Étendre python en C ++ (Boost.NumPy)
Grattage au sélénium en Python
Utiliser le protocole de mesure avec Python
Exploitez LibreOffice avec Python
Grattage avec chromedriver en python
Débogage avec pdb en Python
Gérer les sons en Python
Grattage avec du sélénium en Python
Grattage avec Tor en Python
Tweet avec image en Python
Attention lorsque os.mkdir en Python
Combiné avec ordinal en Python
Erreur lors de la lecture avec python
Nouvelles fonctionnalités de Python 3.9 (1) -L'opérateur d'ensemble de somme peut être utilisé dans le type de dictionnaire.