使用类似python生成器的语法,同时将控制权返回给用户

使用类似python生成器的语法,同时将控制权返回给用户,python,generator,yield,stateful,Python,Generator,Yield,Stateful,使用类似python生成器的语法,同时将控制权返回给用户(创建有状态API) 我有一个类似API的函数,其中用户请求函数,下面是我的代码结构: def api_function(parameters, user: DBUser): # I have a global variable with a list (obj_list) of WorkingChildClass # assume obj is an object of WorkingChildClass specific

使用类似python生成器的语法,同时将控制权返回给用户(创建有状态API)

我有一个类似API的函数,其中用户请求函数,下面是我的代码结构:

def api_function(parameters, user: DBUser):
    # I have a global variable with a list (obj_list) of WorkingChildClass
    # assume obj is an object of WorkingChildClass specifically for this user
    # I've very limited user so I'm storing all objects in the list
    return obj.handle_user_input(parameters)
处理用户输入的函数的定义: 我们正在存储下一个_阶段,因此下次当用户发出请求时,我们将从那里继续,而不是从头开始

class WorkingClass:
    def __init__(self) -> None:
        pass
    
    def handle_user_input(self, parameters):
        while True:
            is_skill_completed, response = self.next_stage(parameters)
            if is_skill_completed:
                return is_skill_completed, response
            if response:
                return is_skill_completed, response
子类,有许多不同功能的子类:

class WorkingChildClass(WorkingClass):
    def __init__(self, jarvis_obj, intent_part) -> None:
        self.next_stage = self.stage1

    def stage1(self, parameters):
        # Do some work
        self.next_stage = self.stage2
        return False, response
        # If response is there then it will be returned to user, otherwise we'll continue to stage2
        # first parameter is whether functionality is completed or not, if it returns True then we'll start stage1 again (this will be handled by the main file as it will recreate the obj)
    
    def stage2(self, parameters):
        # someother stuff
        pass
我想要的不是编写stage1、stage2等函数,而是使用类似生成器(或类似)的语法:

我想要一些类似的语法,它比编写stage1、stage2作为函数和设置next_stage变量更容易出错。这种语法增加了可读性


我不知道这是否可能。但是如果我们能做某种中间函数来存储状态。它可以是一个中间函数,比如handle\u user\u input或decorator或class属性,或者是它们的组合。

我觉得它比我想象的要简单一些。我只是稍微更改了handle\u user\u输入函数

class WorkingClass:
    def __init__(self) -> None:
        self.generator = self.working_function()
    
    def handle_user_input(self, parameters):
        self.parameters = parameters
        while True:
            print("calling next stage.")
            is_skill_completed, responses = next(self.generator)
            print("next stage completed. is_completed: {}, responses: {}".format(is_skill_completed, responses))
            if is_skill_completed:
                return is_skill_completed, responses
            if responses:
                return is_skill_completed, responses
而且很有效!!谢谢

class WorkingClass:
    def __init__(self) -> None:
        self.generator = self.working_function()
    
    def handle_user_input(self, parameters):
        self.parameters = parameters
        while True:
            print("calling next stage.")
            is_skill_completed, responses = next(self.generator)
            print("next stage completed. is_completed: {}, responses: {}".format(is_skill_completed, responses))
            if is_skill_completed:
                return is_skill_completed, responses
            if responses:
                return is_skill_completed, responses