from transitions import Machine
class TradingSystem:
def __init__(self):
self.machine = Machine(model=self, states=['RUNNING'], initial='RUNNING')
def check_running(self) -> None:
if self.is_RUNNING():
print("System is running")
system = TradingSystem()
system.check_running()
mypy transitions_mypy.py
给出错误:
transitions_mypy.py:9: error: "TradingSystem" has no attribute "is_RUNNING" [attr-defined]
可以通过绕过 mypy 来避免这种情况,例如在第 9 行末尾添加
# type: ignore[attr-defined]
。
但是什么是正确的方法呢?避免绕过 mypy 是否更好?也许通过手动定义属性?
首先,这是一个问题的原因是这个“转换”库确实行为不当 - 以这种方式从外部修改 self 并不完全是一个好的做法,例如如果某些东西在修改 self 时已经在使用
is_RUNNING
怎么办?
也就是说,有一种方法可以解决您的问题而无需类型忽略,您只需通过单独的接口模拟转换生成的方法即可。现在我在这里添加了
is_RUNNING
,但您也可以添加其他方法:
from transitions import Machine
class TransitionsInterface:
def is_RUNNING(self) -> bool:
...
class TradingSystem(TransitionsInterface):
def __init__(self):
self.machine = Machine(model=self, states=['RUNNING'], initial='RUNNING')
def check_running(self) -> None:
if self.is_RUNNING():
print("System is running")
system = TradingSystem()
system.check_running()
希望这有帮助!