我已在下面定义了TaskTimer类,并且我想在触发事件时执行多个函数,这可能会也可能没有争论。我想提出一种通用的方法来做到这一点。我的功能没有被执行,我没有理解为什么。我在t.start()中的争论是否不正确?
import System
from System.Timers import (Timer, ElapsedEventArgs)
class TaskTimer(object):
def __init__ (self):
self.timer = Timer ()
self.timer.Enabled = False
self.handlers =[]
def On_Timed_Event (self,source, event):
print 'Event fired', event.SignalTime
for handler in self.handlers:
handler(*self.my_args,**self.kwargs)
def start(self,interval, repeat, *args, **kwargs):
self.repeat = repeat
self.run = True #True if timer is running
self.timer.Interval= interval
self.timer.Enabled = True
self.my_args= args
self.kwargs = kwargs
for x in self.my_args:
self.handlers.append(x)
self.timer.Elapsed += self.On_Timed_Event
def func1(a,b):
print 'function 1. this function does task1'
print '1...1...1...'
return None
def func2(d):
print 'Function 2. This function does something'
print '2...2...2...'
return None
def func3(a,b,c):
print 'function 3. This function does something else'
return None
def main():
t= TaskTimer()
D= {'fun2':'func2', 'arg2':'3'}
t.start(5000,False,func1, func2, func3, a= 1, b=3, c=4, d=D)
if __name__ == '__main__':
main()
我正在试验,所以我编辑了def_Timed_Event函数和func1,func2和func3,如下所示。我还根据@Ewan的建议在函数中添加了print语句。 Python会自动替换** self.kwargs中的函数变量吗?
def On_Timed_Event (self,source, event):
print '\nEvent fired', event.SignalTime
for handler in self.handlers:
print 'length of self.handlers', len(self.handlers)
print 'args', self.my_args
print 'kwargs', self.kwargs
print 'handler', handler
handler(**self.kwargs)
self.handler[handler](**self.kwargs)
def func1(a,b):
print 'function 1. this function does task1'
print 'func1', a,b
print '1...1...1...'
return None
def func2(d):
print 'Function 2. This function does something'
print 'func2', d
print '2...2...2...'
return None
def func3(a,b,c):
print 'function 3. This function does something else'
print 'func3', a,b,c
return None
代码在IronPyhton控制台中运行。 ![IronPython_console] [2]
[2]: http://i.stack.imgur.com/vYW0S.jpg
答案 0 :(得分:0)
首先,我可以看到你在这条线上遇到麻烦:
handler(*self.my_args,**self.kwargs)
由于您未接受kwargs
,func1
或func2
中的任何额外func3
,如果达到这些内容,我希望看到以下内容:
In [1]: def func1(a, b):
...: print(a, b)
...:
In [2]: kwg = {'a':1, 'b':3, 'c':4, 'd':{'fun2':'func2', 'arg2':'3'}}
In [3]: func1(**kwg)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-12557b6441ce> in <module>()
----> 1 func1(**kwg)
TypeError: func1() got an unexpected keyword argument 'c'
就个人而言,我会在其中放入一些不错的日志/调试语句,以找出程序在堆栈中的位置。
self.timer.Elapsed += self.On_Timed_Event
?
timer.Elapsed
值上添加时间,但self.On_Timed_Event
无法返回任何内容On_Timed_Event
需要2个参数(source, event
),但是您似乎没有传入它们,这也会导致程序失败。Event fired
中看到stdout
,或者该计划是否未到达On_Timed_Event
?这可能会在您的System.Timers
代码中显示问题。