尝试按照此处提供的示例使用transitions
包https://github.com/pytransitions/transitions
出于某种原因,下面显示的两种方法都没有为注册的evaporate()
触发器提供键入建议(至少在PyCharm 2019.1.2中适用于Windows x64)
同时,这些触发器仍然可以使用
在我键入时,可以做些什么来建议这些触发器
class Matter(Machine):
def say_hello(self): print("hello, new state!")
def say_goodbye(self): print("goodbye, old state!")
def __init__(self):
states = ['solid', 'liquid', 'gas']
Machine.__init__(self, states=states, initial='liquid')
self.add_transition('melt', 'solid', 'liquid')
testmatter= Matter()
testmatter.add_transition('evaporate', 'liquid', 'gas')
testmatter.evaporate()
Out: True
testmatter.get_model_state(testmatter)
Out: <State('gas')@14748976>
class Matter2():
pass
testmatter2 = Matter2()
machine = Machine(model=testmatter2, states=['solid', 'liquid', 'gas', 'plasma'], initial='liquid')
machine.add_transition('evaporate', 'liquid', 'gas')
testmatter2.evaporate()
Out: True
transitions
在运行时向模型(Matter
)实例添加触发器。在初始化代码实际执行之前,IDE无法预测这一点。这是transitions
工作方式的最大缺点(但同样,在处理动态状态机或运行时创建/接收的状态机时,这也是它的优点,但这是另一回事)如果使用带代码完成的交互式shell(ipython),您将看到
evaporate
(基于对模型的__dir__
调用) 将建议:但我想这不是你计划的编码方式。那么,我们如何给内省提供提示呢
最简单的解决方案:为您的模型使用docstring来宣布触发器。
这里的问题是IDE将依赖于docstring来纠正错误。因此,当docstring方法(伪装为属性)被调用
evaparate
时,它将始终建议,即使稍后添加evaporate
使用
pyi
文件和PEP484(PyCharm解决方案)不幸的是,PyCharm没有考虑到代码字符串中的属性,因为您正确地指出了(参见this discussion以获得更多的细节)。我们需要使用另一种方法。我们可以创建所谓的
pyi
文件来为PyCharm提供提示。这些文件的命名与.py
对应文件相同,但仅用于IDE和其他工具,不得导入(请参见this post)。让我们创建一个名为sandbox.pyi
的文件现在,让我们创建实际的代码文件
sandbox.py
(我没有将我的游乐场文件命名为“test”,因为这总是让pytest感到吃惊…)这样您就可以完成代码,并且
transitions
将正确地装饰模型。缺点是,您需要担心另一个文件可能会使您的项目变得混乱如果要自动生成
pyi
文件,可以查看stubgen或扩展Machine
以生成模型的事件存根备选方案:从docstrings
类似的问题已经在过渡问题跟踪中讨论过(见https://github.com/pytransitions/transitions/issues/383)。您还可以从模型的docstring生成机器配置:
这是一个非常简单的docstring-to-machine配置解析器,它不考虑可能成为docstring一部分的所有可能性。它假设具有包含(“source:”)的docstring的每个方法都应该是触发器。然而,它也处理文件问题。使用这样的机器可以确保至少有一些已开发机器的文档存在
相关问题 更多 >
编程相关推荐