Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 无法运行中所示的超时机制https://github.com/tyarkoni/transitions/issues/198._Python 2.7_Ipython_Transitions - Fatal编程技术网

Python 2.7 无法运行中所示的超时机制https://github.com/tyarkoni/transitions/issues/198.

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

我需要你的帮助

试图为这里提到的状态机设置超时功能。在机器初始化时,继续接收:

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 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()

从度假回来得到了这个惊喜;谢谢你!