如何为transitions库生成的动态方法添加文档以支持IDE自动补全
解决方案
可以实现,常用的有三种落地方式,分别适配不同的使用场景:
方案1:提前显式声明动态方法(兼容性最好,所有IDE都支持)
动态生成的方法无法被IDE静态分析识别,你可以在类内提前声明这些方法的签名、文档字符串和类型注解,运行时transitions生成的实际方法会自动覆盖占位定义,不会影响业务逻辑:
from typing import Literal, Optional from transitions import Machine as LHGMachine class Experiment: # 状态列表 states=['solid', 'liquid', 'gas', 'plasma'] # 每个trigger都会生成一个动态方法 transitions = [ { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid' }, { 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas' }, { 'trigger': 'sublimate', 'source': 'solid', 'dest': 'gas' }, { 'trigger': 'ionize', 'source': 'gas', 'dest': 'plasma' } ] # 提前声明动态方法,加文档和类型注解 def melt(self) -> bool: """将状态从solid转换为liquid,转换成功返回True,失败返回False""" ... def evaporate(self) -> bool: """将状态从liquid转换为gas,转换成功返回True,失败返回False""" ... def sublimate(self) -> bool: """将状态从solid直接转换为gas,转换成功返回True,失败返回False""" ... def ionize(self) -> bool: """将状态从gas转换为plasma,转换成功返回True,失败返回False""" ... def __init__(self): self.machine = LHGMachine(model=self, states=self.states, transitions=self.transitions, initial=self.states[0])
如果你的trigger方法需要传入额外参数,直接在声明里加上对应的参数和类型注解即可,IDE会同步提示参数信息。
方案2:使用类型存根文件(.pyi),适合不想污染业务类代码的场景
在和业务类所在py文件的同目录下,新建一个同名的.pyi存根文件,比如你的类写在experiment.py里,就新建experiment.pyi,内容如下:
from typing import Literal, Optional class Experiment: states: list[str] transitions: list[dict] machine: LHGMachine def melt(self) -> bool: """将状态从solid转换为liquid,转换成功返回True,失败返回False""" def evaporate(self) -> bool: """将状态从liquid转换为gas,转换成功返回True,失败返回False""" def sublimate(self) -> bool: """将状态从solid直接转换为gas,转换成功返回True,失败返回False""" def ionize(self) -> bool: """将状态从gas转换为plasma,转换成功返回True,失败返回False""" def __init__(self) -> None: ...
存根文件只会被IDE的静态类型检查器读取,完全不会影响运行时代码,也不会污染业务逻辑。
方案3:适配动态配置场景
如果你的状态和转换规则是动态生成的、数量较多不适合手动编写,可以写一个简单的本地脚本,批量根据states和transitions配置生成对应的存根文件或者类内方法声明,避免手动重复劳动。
内容的提问来源于stack exchange,提问作者Michael Ben-Nes
相关产品推荐
相关产品推荐

