Python 2.7 无法运行中所示的超时机制https://github.com/tyarkoni/transitions/issues/198.
我需要你的帮助 试图为这里提到的状态机设置超时功能。在机器初始化时,继续接收: TypeError:init获得意外的关键字参数“parent” 尽管所有cunstructor参数都是传播的 My codePython 2.7.6/IPython 5.1.0:Python 2.7 无法运行中所示的超时机制https://github.com/tyarkoni/transitions/issues/198.,python-2.7,ipython,transitions,Python 2.7,Ipython,Transitions,我需要你的帮助 试图为这里提到的状态机设置超时功能。在机器初始化时,继续接收: TypeError:init获得意外的关键字参数“parent” 尽管所有cunstructor参数都是传播的 My codePython 2.7.6/IPython 5.1.0: from transitions.extensions import HierarchicalMachine as Machine import time from threading import Thread from transi
from transitions.extensions import HierarchicalMachine as Machine
import time
from threading import Thread
from transitions import State
class Timeout(Thread):
def __init__(self, func, timeout):
super(Timeout, self).__init__()
self.func = func
self.timeout = timeout
self.canceled = False
print 'Starting countdown'
self.start()
def run(self):
time.sleep(self.timeout)
print 'Timeout occurred'
if not self.canceled:
self.func()
class TimeoutState(State):
def __init__(self, name, timeout=None, *args, **kwargs):
self.timeout = timeout
super(TimeoutState, self).__init__(name=name, *args, **kwargs)
class TimeoutMachine(Machine):
def __init__(self, model, states, transitions, initial, title):
super(Machine, self).__init__( model=model,
states=states,
transitions=transitions,
initial=initial,
name=title,
queued=True,
auto_transitions=True,
send_event=True)
def _create_state(self, *args, **kwargs):
return TimeoutState(*args, **kwargs)
class Model():
def __init__(self):
self.timer = None
def set_timeout(self, event_data):
timeout=event_data.kwargs.pop('timeout',3)
self.timer = Timeout(self.doTimeout, timeout)
model = Model()
transitions = [{'doTimeout', 'B', 'C'}]
b = TimeoutState(name='B',timeout=5, on_enter='set_timeout')
machine = TimeoutMachine(model=model, states=['A', b, 'C'],
transitions=transitions, initial='A',
title='TestMachineWithTimeouts')
错误堆栈:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", line 2881, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-40-747d39e2dc66>", line 1, in <module>
t.TimeoutMachine(model=model, states=['A', b, 'C'], transitions=transitions, initial='A', title='TestMachineWithTimeouts')
File "/home/sge/workspace_neon/ocpp16j_dev/_test_.py", line 61, in __init__
send_event=True)
File "build/bdist.linux-i686/egg/transitions/core.py", line 364, in __init__
self.add_states(states)
File "build/bdist.linux-i686/egg/transitions/extensions/nesting.py", line 264, in add_states
new_states = self.traverse(states, *args, **kwargs)
File "build/bdist.linux-i686/egg/transitions/extensions/nesting.py", line 183, in traverse
ignore_invalid_triggers=ignore))
File "/home/sge/workspace_neon/ocpp16j_dev/_test_.py", line 78, in _create_state
return TimeoutState(*args, **kwargs)
File "/home/sge/workspace_neon/ocpp16j_dev/_test_.py", line 46, in __init__
super(TimeoutState, self).__init__(name=name, *args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'parent'
怎么了?有线索吗
谢谢大家! 您的示例至少有三个问题: 问题:HierarchycalMachine需要transitions.extensions.nesting.NestedState类型的状态 解决方案:只需将正确的状态子类化。最简单的修复方法是将from transitions导入状态替换为from transitions.extensions.nesting导入NestedState作为状态 问题:在TimeoutMachine中。_uinit_;您使用基类而不是子类调用super。这实际上会调用机器基类的_uinit__;方法(如果有) 解决方案:将超级机器self.\uuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 问题:转换定义为集合,但转换仅支持用于此目的的数组或字典 解决方案:将转换=[{'doTimeout','B','C'}]更改为转换=[['doTimeout','B','C']]或转换=[{'trigger':'doTimeout','source':'B','dest':'C'}] 还有一句话:由于您将TimeoutMachine子类化,并将TimeoutState用作默认状态,因此不必手动创建状态。您可以这样定义您的状态: states=['A','C',{'name':'B','timeout':5','on\u enter':'set\u timeout'}] 工作代码:
from transitions.extensions import HierarchicalMachine as Machine
import time
from threading import Thread
from transitions.extensions.nesting import NestedState as State
class Timeout(Thread):
def __init__(self, func, timeout):
super(Timeout, self).__init__()
self.func = func
self.timeout = timeout
self.canceled = False
print 'Starting countdown'
self.start()
def run(self):
time.sleep(self.timeout)
print 'Timeout occurred'
if not self.canceled:
self.func()
class TimeoutState(State):
def __init__(self, name, timeout=None, *args, **kwargs):
self.timeout = timeout
super(TimeoutState, self).__init__(name=name, *args, **kwargs)
class TimeoutMachine(Machine):
def __init__(self, model, states, transitions, initial, title):
super(TimeoutMachine, self).__init__(model=model,
states=states,
transitions=transitions,
initial=initial,
name=title,
queued=True,
auto_transitions=True,
send_event=True)
def _create_state(self, *args, **kwargs):
return TimeoutState(*args, **kwargs)
class Model:
def __init__(self):
self.timer = None
def set_timeout(self, event_data):
timeout = event_data.kwargs.pop('timeout', 3)
self.timer = Timeout(self.doTimeout, timeout)
model = Model()
transitions = [{'trigger': 'doTimeout', 'source':'B', 'dest':'C'}]
states = ['A', 'C', {'name': 'B', 'timeout': 5, 'on_enter': 'set_timeout'}]
machine = TimeoutMachine(model=model, states=states,
transitions=transitions, initial='A',
title='TestMachineWithTimeouts')
model.to_B()
从度假回来得到了这个惊喜;谢谢你!