GraphMachine 不会为 NarcolepticSuperhero 快速入门示例生成图表

GraphMachine doesn't generate graph for NarcolepticSuperhero quickstart example

我尝试使用 GitHub 文档中定义的 NarcolepticSuperhero 机器创建图表,但它只输出:

重建步骤:

  1. 创建一个名为 test.py 的文件,内容如下:
    from transitions import Machine
    from transitions.extensions import GraphMachine
    import random
    
    class NarcolepticSuperhero(object):
    
        # Define some states. Most of the time, narcoleptic superheroes are just like
        # everyone else. Except for...
        states = ['asleep', 'hanging out', 'hungry', 'sweaty', 'saving the world']
    
        def __init__(self, name):
    
            # No anonymous superheroes on my watch! Every narcoleptic superhero gets
            # a name. Any name at all. SleepyMan. SlumberGirl. You get the idea.
            self.name = name
    
            # What have we accomplished today?
            self.kittens_rescued = 0
    
            # Initialize the state machine
            self.machine = Machine(model=self, states=NarcolepticSuperhero.states, initial='asleep')
    
            # Add some transitions. We could also define these using a static list of
            # dictionaries, as we did with states above, and then pass the list to
            # the Machine initializer as the transitions= argument.
    
            # At some point, every superhero must rise and shine.
            self.machine.add_transition(trigger='wake_up', source='asleep', dest='hanging out')
    
            # Superheroes need to keep in shape.
            self.machine.add_transition('work_out', 'hanging out', 'hungry')
    
            # Those calories won't replenish themselves!
            self.machine.add_transition('eat', 'hungry', 'hanging out')
    
            # Superheroes are always on call. ALWAYS. But they're not always
            # dressed in work-appropriate clothing.
            self.machine.add_transition('distress_call', '*', 'saving the world',
                                before='change_into_super_secret_costume')
    
            # When they get off work, they're all sweaty and disgusting. But before
            # they do anything else, they have to meticulously log their latest
            # escapades. Because the legal department says so.
            self.machine.add_transition('complete_mission', 'saving the world', 'sweaty',
                                after='update_journal')
    
            # Sweat is a disorder that can be remedied with water.
            # Unless you've had a particularly long day, in which case... bed time!
            self.machine.add_transition('clean_up', 'sweaty', 'asleep', conditions=['is_exhausted'])
            self.machine.add_transition('clean_up', 'sweaty', 'hanging out')
    
            # Our NarcolepticSuperhero can fall asleep at pretty much any time.
            self.machine.add_transition('nap', '*', 'asleep')
    
        def update_journal(self):
            """ Dear Diary, today I saved Mr. Whiskers. Again. """
            self.kittens_rescued += 1
    
        @property
        def is_exhausted(self):
            """ Basically a coin toss. """
            return random.random() < 0.5
    
        def change_into_super_secret_costume(self):
            print("Beauty, eh?")
            
    batman = NarcolepticSuperhero("Batman")
    batman.wake_up()
    batman.state
    
    machine = GraphMachine(model=batman)
    batman.get_graph().draw("test.png", prog='dot')
  1. 安装要求(Ubuntu 20.10,我测试了它的 docker 图像)和 运行 脚本:
$ apt install graphviz graphviz-dev
$ pip3 install transitions graphviz pygraphviz
$ python3 test.py
  1. 检查生成的图像

您正在实例化 GraphMachine,这里没有任何状态和转换:

machine = GraphMachine(model=batman)

您基本上是将 NarcolepticSuperhero 重新用作该新机器的模型,但您应该做的是将 NarcolepticSuperhero 的机器更改为 GraphMachine:

            # Initialize the state machine
            self.machine = GraphMachine(model=self, states=NarcolepticSuperhero.states, initial='asleep')

# [...]
    batman.state
    
    # this is not required anymore
    # machine = GraphMachine(model=batman)
    batman.get_graph().draw("test.png", prog='dot')