Proposal: Support Class-Based Syntax for Python Entities

Ouverte
#278 4 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Évaluation

Difficulté
5/5
Temps estimé
Plus d'une semaine
Accessibilité débutants
25/100
Type d'issue
Fonctionnalité
Clarté
À clarifier
Activité
À l'abandon
Stack technique
python
Domaine
backend

Piste de recherche

L’issue ne mentionne aucun fichier ni test. Commencez par examiner la gestion existante des entités basée sur des fonctions autour de DurableEntityContext et l’exemple TypeScript lié, puis déterminez comment les méthodes de classe, l’initialisation, les résultats renvoyés et l’état persisté doivent correspondre au modèle d’entités actuel. La tâche ne pourra être considérée comme terminée qu’une fois qu’une conception validée de la syntaxe et de la gestion de l’état aura été définie avant l’implémentation.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

Enhancement fixed-in-v2

Currently, Entities in Python (and JavaScript) only support function-based syntax, where operations are delineated by a cascade of if-statements. In C#, a class-based syntax is supported, which allows individual operations to be split into methods belonging to a larger class that represents the Entity itself.

Implementing this alternative syntax should not be too difficult, it's mostly just a layer of indirection. Making matters simpler, we already have a community-driven example of how to do this for TypeScript here: https://scale-tone.github.io/2021/03/15/durable-mvc .

As an example for the syntax, consider the following entity function using the current implementation syntax

def entity_function(context: df.DurableEntityContext):
    current_value = context.get_state(lambda: 0)
    operation = context.operation_name
    if operation == "add":
        amount = context.get_input()
        current_value += amount
    elif operation == "reset":
        current_value = 0
    elif operation == "get":
        pass
    
    context.set_state(current_value)
    context.set_result(current_value)

It's class-based syntax alternative would look as follows:

class Counter:
   def __init__(self): # this corresponds to state initializer, or the `lambda: 0` in the function-based syntax
       self.entity_state= 0
 
    def add(self, amount):
        self.entity_state+= amount
        return self.entity_state
    def get(self):
        return self.entity_state
     def reset(self):
        return self.entity_state= 0

Finally, it makes sense to me that the return statement would set the value for context.set_result. A more difficult question is to know what value to save for set_state. One easy solution is to require the state to be under the name self.entity_state but perhaps that's too restrictive. What do others think?

Langage dominant
Python
Étoiles
157
Forks
71
Métriques de merge des PR
Aucune PR mergée en 30 j

Préparer son environnement

Ouvrir dans Codespaces

Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de Azure/azure-functions-durable-python

Toutes les issues de Azure/azure-functions-durable-python

Issues similaires

Plus d'issues Python

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.