Python 将多个函数传递给类方法
我在下面定义了TaskTimer类,我希望在触发事件时执行多个函数,这些函数可能有参数,也可能没有参数。我想提出一个通用的方法来做这件事。我的功能没有被执行,我不理解为什么。我在t.start()中的论点是否不正确Python 将多个函数传递给类方法,python,function,events,arguments,ironpython,Python,Function,Events,Arguments,Ironpython,我在下面定义了TaskTimer类,我希望在触发事件时执行多个函数,这些函数可能有参数,也可能没有参数。我想提出一个通用的方法来做这件事。我的功能没有被执行,我不理解为什么。我在t.start()中的论点是否不正确 import System from System.Timers import (Timer, ElapsedEventArgs) class TaskTimer(object): def __init__ (self): self.timer =
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_事件函数和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
代码在IronPyton控制台中运行。
![铁人台][2]
[2]: http://i.stack.imgur.com/vYW0S.jpg
首先,我可以看到您在这一行遇到了问题:
handler(*self.my_args,**self.kwargs)
由于您在func1
、func2
或func3
中不接受任何额外的kwargs
,因此,如果达到他们的要求,我希望看到以下内容:
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'
[1]中的:定义函数1(a,b):
…:打印(a,b)
...:
在[2]中:kwg={'a':1,'b':3,'c':4,'d':{'fun2':'func2','arg2':'3'}
在[3]中:func1(**kwg)
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1职能1(**kwg)
TypeError:func1()获得意外的关键字参数“c”
就我个人而言,我会加入一些不错的日志记录/调试语句,以找出程序在堆栈中的位置
- 程序是否成功完成,或者您是否得到回溯李>
- 这是设计用来做什么的:
?self.timer.appeased+=self.On\u Timed\u事件
- 它看起来应该是在您的
值,但是计时器上添加一个时间。已用
self.On\u Timed\u事件
- 它看起来应该是在您的
接受2个参数(On_Timed_Event
),但是您似乎没有传入它们,这也会导致程序失败源,事件
- 您是否在
上启动标准输出中看到触发了
,或者程序根本无法在事件事件
?这可能表明您的
系统中存在问题。计时器
代码
self.timer.appeased+=self.On\u Timed\u Event
事件?@jornsharpe应该在On\u Timed\u Events中执行代码。它正在部分地执行,但是我在执行函数时遇到了问题。我想将任意数量的函数传递给TaskTimer。我将编辑我的问题以提供更多细节。我遵照您的建议,在函数中添加了打印语句。但是,参数似乎没有传递到函数中。Python是否应该使用**self.kwargs生成参数替换?代码运行iside IronPython控制台。我试图添加一个控制台的图像,但它确实有效。谢谢你的评论。看来我必须修改func1、func2和func3的参数列表,以包含**kwargs。